Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
75 commits
Select commit Hold shift + click to select a range
1d07034
Implementation of GenericArrayData specialized for primitive type array
kiszk Jun 18, 2016
7b48a30
fix scala style error
kiszk Jun 18, 2016
b5876a6
Introduce GenericRefArrayData
kiszk Jun 21, 2016
ac5b73b
replace 'new GenericArrayData' with 'GenericArrayData.allocate'
kiszk Jun 21, 2016
dab5a8c
Generate GenericArrayData.allocate in NewInstance()
kiszk Jun 22, 2016
a8fe2d8
intial version of Benchmark without performance
kiszk Jun 22, 2016
870dc84
move project of Benchmark program
kiszk Jun 22, 2016
7cdd558
update benchmark program
kiszk Jun 22, 2016
d28e256
addressed review comments
kiszk Jun 22, 2016
e95e137
fix test failures
kiszk Jun 22, 2016
2b27bb3
Enabled all of benchmark suites with performance data
kiszk Jun 22, 2016
878262b
fix test failures
kiszk Jun 22, 2016
6efddf0
update test suite to resolve test failures
kiszk Jun 23, 2016
4d2b6bc
fix compilation error
kiszk Jun 23, 2016
f55aeea
addressed comments
kiszk Jun 25, 2016
78aaf13
fix test failures
kiszk Jun 25, 2016
8b908e2
fix descriptions
kiszk Jun 25, 2016
e9ec382
Better usage of GenericArrayData
kiszk Jun 25, 2016
ae9591e
revert part of changes
kiszk Jun 26, 2016
79f4c95
undo revert
kiszk Jun 26, 2016
f93fbc2
revert changes at 0800fdc5
kiszk Jun 26, 2016
a452bda
add null check after asInstanceOf
kiszk Jun 26, 2016
685d3e7
generate GenericArrayData.allocate in NewInstance
kiszk Jun 26, 2016
29c8519
fix test failure
kiszk Jun 27, 2016
0e43c4b
fix test failure
kiszk Jun 27, 2016
d15a46c
update
kiszk Jul 11, 2016
3e84fdb
replace new GenericArrayData with GenericArrayData.allocate
kiszk Jul 11, 2016
604293e
rebase
kiszk Jul 25, 2016
1dcd582
rebase
kiszk Sep 10, 2016
e60bf40
reimplement without factory method
kiszk Oct 1, 2016
e541f35
update benchmark programs
kiszk Oct 1, 2016
22d310b
fix scala style error
kiszk Oct 1, 2016
8684ad6
fix test failure in OrcQuerySuite
kiszk Oct 1, 2016
aa3ada8
fix test failure (DatasetPrimitiveSuites)
kiszk Oct 1, 2016
a81ee14
update benchmark results
kiszk Oct 1, 2016
681ae03
Implementation of GenericArrayData specialized for primitive type array
kiszk Jun 18, 2016
556e76e
fix scala style error
kiszk Jun 18, 2016
ff45703
Introduce GenericRefArrayData
kiszk Jun 21, 2016
23f9f65
replace 'new GenericArrayData' with 'GenericArrayData.allocate'
kiszk Jun 21, 2016
839bcb8
Generate GenericArrayData.allocate in NewInstance()
kiszk Jun 22, 2016
97068d4
intial version of Benchmark without performance
kiszk Jun 22, 2016
cf2b216
move project of Benchmark program
kiszk Jun 22, 2016
8df1c34
update benchmark program
kiszk Jun 22, 2016
040d9aa
addressed review comments
kiszk Jun 22, 2016
cabc27a
fix test failures
kiszk Jun 22, 2016
80abdbb
Enabled all of benchmark suites with performance data
kiszk Jun 22, 2016
9311664
fix test failures
kiszk Jun 22, 2016
25105f3
update test suite to resolve test failures
kiszk Jun 23, 2016
f328662
fix compilation error
kiszk Jun 23, 2016
16de76f
addressed comments
kiszk Jun 25, 2016
12d138e
fix test failures
kiszk Jun 25, 2016
19c453b
fix descriptions
kiszk Jun 25, 2016
bf34ec4
Better usage of GenericArrayData
kiszk Jun 25, 2016
9cd7776
revert part of changes
kiszk Jun 26, 2016
d0b3f60
undo revert
kiszk Jun 26, 2016
8b19f75
revert changes at 0800fdc5
kiszk Jun 26, 2016
7b0e769
add null check after asInstanceOf
kiszk Jun 26, 2016
1a0486f
generate GenericArrayData.allocate in NewInstance
kiszk Jun 26, 2016
963876f
fix test failure
kiszk Jun 27, 2016
d50ee04
fix test failure
kiszk Jun 27, 2016
d581439
update
kiszk Jul 11, 2016
8063e63
replace new GenericArrayData with GenericArrayData.allocate
kiszk Jul 11, 2016
090869d
update benchmark program
kiszk Jul 19, 2016
1837792
rebase
kiszk Jul 25, 2016
06b07da
rebase
kiszk Sep 10, 2016
06c22ac
reimplement without factory method
kiszk Oct 1, 2016
4c6f41e
update benchmark programs
kiszk Oct 1, 2016
9031224
fix scala style error
kiszk Oct 1, 2016
ecbc32e
fix test failure in OrcQuerySuite
kiszk Oct 1, 2016
503dbde
update benchmark results
kiszk Oct 1, 2016
c7ed68f
fix compilation error
kiszk Nov 8, 2016
c82fbf3
add another use cases from #13909
kiszk Nov 8, 2016
6bf54ec
update benchmark results
kiszk Nov 8, 2016
8bcba32
Revert "update benchmark results"
kiszk Nov 9, 2016
7697e5f
Revert "add another use cases from #13909"
kiszk Nov 9, 2016
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,8 @@

package org.apache.spark.sql.catalyst.expressions.codegen;

import org.apache.spark.sql.catalyst.util.ArrayData;
import org.apache.spark.sql.catalyst.util.GenericArrayData;
import org.apache.spark.sql.types.Decimal;
import org.apache.spark.unsafe.Platform;
import org.apache.spark.unsafe.array.ByteArrayMethods;
Expand Down Expand Up @@ -259,4 +261,116 @@ public void write(int ordinal, CalendarInterval input) {
// move the cursor forward.
holder.cursor += 16;
}

public void writePrimitiveBooleanArray(ArrayData arrayData) {
boolean[] input;
if (arrayData instanceof GenericArrayData &&
(input = ((GenericArrayData)arrayData).booleanArray()) != null) {
int length = input.length;
Platform.copyMemory(input, Platform.BOOLEAN_ARRAY_OFFSET,
holder.buffer, startingOffset + headerInBytes, length);
} else {
int length = arrayData.numElements();
for (int i = 0; i < length; i++) {
Platform.putBoolean(holder.buffer, startingOffset + headerInBytes + i,
arrayData.getBoolean(i));
}
}
}

public void writePrimitiveByteArray(ArrayData arrayData) {
byte[] input;
if (arrayData instanceof GenericArrayData &&
(input = ((GenericArrayData)arrayData).byteArray()) != null) {
int length = input.length;
Platform.copyMemory(input, Platform.BYTE_ARRAY_OFFSET,
holder.buffer, startingOffset + headerInBytes, length);
} else {
int length = arrayData.numElements();
for (int i = 0; i < length; i++) {
Platform.putByte(holder.buffer, startingOffset + headerInBytes + i,
arrayData.getByte(i));
}
}
}

public void writePrimitiveShortArray(ArrayData arrayData) {
short[] input;
if (arrayData instanceof GenericArrayData &&
(input = ((GenericArrayData)arrayData).shortArray()) != null) {
int length = input.length * 2;
Platform.copyMemory(input, Platform.SHORT_ARRAY_OFFSET,
holder.buffer, startingOffset + headerInBytes, length);
} else {
int length = arrayData.numElements();
for (int i = 0; i < length; i++) {
Platform.putShort(holder.buffer, startingOffset + headerInBytes + i * 2,
arrayData.getShort(i));
}
}
}

public void writePrimitiveIntArray(ArrayData arrayData) {
int[] input;
if (arrayData instanceof GenericArrayData &&
(input = ((GenericArrayData)arrayData).intArray()) != null) {
int length = input.length * 4;
Platform.copyMemory(input, Platform.INT_ARRAY_OFFSET,
holder.buffer, startingOffset + headerInBytes, length);
} else {
int length = arrayData.numElements();
for (int i = 0; i < length; i++) {
Platform.putInt(holder.buffer, startingOffset + headerInBytes + i * 4,
arrayData.getInt(i));
}
}
}

public void writePrimitiveLongArray(ArrayData arrayData) {
long[] input;
if (arrayData instanceof GenericArrayData &&
(input = ((GenericArrayData)arrayData).longArray()) != null) {
int length = input.length * 8;
Platform.copyMemory(input, Platform.LONG_ARRAY_OFFSET,
holder.buffer, startingOffset + headerInBytes, length);
} else {
int length = arrayData.numElements();
for (int i = 0; i < length; i++) {
Platform.putLong(holder.buffer, startingOffset + headerInBytes + i * 8,
arrayData.getLong(i));
}
}
}

public void writePrimitiveFloatArray(ArrayData arrayData) {
float[] input;
if (arrayData instanceof GenericArrayData &&
(input = ((GenericArrayData)arrayData).floatArray()) != null) {
int length = input.length * 4;
Platform.copyMemory(input, Platform.FLOAT_ARRAY_OFFSET,
holder.buffer, startingOffset + headerInBytes, length);
} else {
int length = arrayData.numElements();
for (int i = 0; i < length; i++) {
Platform.putFloat(holder.buffer, startingOffset + headerInBytes + i * 4,
arrayData.getFloat(i));
}
}
}

public void writePrimitiveDoubleArray(ArrayData arrayData) {
double[] input;
if (arrayData instanceof GenericArrayData &&
(input = ((GenericArrayData)arrayData).doubleArray()) != null) {
int length = input.length * 8;
Platform.copyMemory(input, Platform.DOUBLE_ARRAY_OFFSET,
holder.buffer, startingOffset + headerInBytes, length);
} else {
int length = arrayData.numElements();
for (int i = 0; i < length; i++) {
Platform.putDouble(holder.buffer, startingOffset + headerInBytes + i * 8,
arrayData.getDouble(i));
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -117,12 +117,12 @@ object GenerateUnsafeProjection extends CodeGenerator[Seq[Expression], UnsafePro
$rowWriter.setOffsetAndSize($index, $tmpCursor, $bufferHolder.cursor - $tmpCursor);
"""

case a @ ArrayType(et, _) =>
case a @ ArrayType(et, cn) =>
s"""
// Remember the current cursor so that we can calculate how many bytes are
// written later.
final int $tmpCursor = $bufferHolder.cursor;
${writeArrayToBuffer(ctx, input.value, et, bufferHolder)}
${writeArrayToBuffer(ctx, input.value, et, cn, bufferHolder)}
$rowWriter.setOffsetAndSize($index, $tmpCursor, $bufferHolder.cursor - $tmpCursor);
"""

Expand Down Expand Up @@ -171,6 +171,7 @@ object GenerateUnsafeProjection extends CodeGenerator[Seq[Expression], UnsafePro
ctx: CodegenContext,
input: String,
elementType: DataType,
containsNull: Boolean,
bufferHolder: String): String = {
val arrayWriterClass = classOf[UnsafeArrayWriter].getName
val arrayWriter = ctx.freshName("arrayWriter")
Expand Down Expand Up @@ -202,10 +203,10 @@ object GenerateUnsafeProjection extends CodeGenerator[Seq[Expression], UnsafePro
$arrayWriter.setOffsetAndSize($index, $tmpCursor, $bufferHolder.cursor - $tmpCursor);
"""

case a @ ArrayType(et, _) =>
case a @ ArrayType(et, cn) =>
s"""
final int $tmpCursor = $bufferHolder.cursor;
${writeArrayToBuffer(ctx, element, et, bufferHolder)}
${writeArrayToBuffer(ctx, element, et, cn, bufferHolder)}
$arrayWriter.setOffsetAndSize($index, $tmpCursor, $bufferHolder.cursor - $tmpCursor);
"""

Expand All @@ -225,21 +226,39 @@ object GenerateUnsafeProjection extends CodeGenerator[Seq[Expression], UnsafePro
}

val primitiveTypeName = if (ctx.isPrimitiveType(jt)) ctx.primitiveTypeName(et) else ""
val storeElements = if (containsNull) {
s"""
for (int $index = 0; $index < $numElements; $index++) {
if ($input.isNullAt($index)) {
$arrayWriter.setNull$primitiveTypeName($index);
} else {
final $jt $element = ${ctx.getValue(input, et, index)};
$writeElement
}
}
"""
} else {
if (ctx.isPrimitiveType(et)) {
val typeName = ctx.primitiveTypeName(et)
s"$arrayWriter.writePrimitive${typeName}Array($input);"
} else {
s"""
for (int $index = 0; $index < $numElements; $index++) {
final $jt $element = ${ctx.getValue(input, et, index)};
$writeElement
}
"""
}
}

s"""
if ($input instanceof UnsafeArrayData) {
${writeUnsafeData(ctx, s"((UnsafeArrayData) $input)", bufferHolder)}
} else {
final int $numElements = $input.numElements();
$arrayWriter.initialize($bufferHolder, $numElements, $elementOrOffsetSize);

for (int $index = 0; $index < $numElements; $index++) {
if ($input.isNullAt($index)) {
$arrayWriter.setNull$primitiveTypeName($index);
} else {
final $jt $element = ${ctx.getValue(input, et, index)};
$writeElement
}
}
$storeElements
}
"""
}
Expand Down Expand Up @@ -271,11 +290,11 @@ object GenerateUnsafeProjection extends CodeGenerator[Seq[Expression], UnsafePro
// Remember the current cursor so that we can write numBytes of key array later.
final int $tmpCursor = $bufferHolder.cursor;

${writeArrayToBuffer(ctx, keys, keyType, bufferHolder)}
${writeArrayToBuffer(ctx, keys, keyType, false, bufferHolder)}
// Write the numBytes of key array into the first 8 bytes.
Platform.putLong($bufferHolder.buffer, $tmpCursor - 8, $bufferHolder.cursor - $tmpCursor);

${writeArrayToBuffer(ctx, values, valueType, bufferHolder)}
${writeArrayToBuffer(ctx, values, valueType, true, bufferHolder)}
}
"""
}
Expand Down
Loading