[SPARK-26985][CORE] Fix "access only some column of the all of columns " for big endian architecture BUG
continuation to https://github.com/apache/spark/pull/24788 ## What changes were proposed in this pull request? Changes are related to BIG ENDIAN system This changes are done to identify s390x platform. use byteorder to BIG_ENDIAN for big endian systems changes for 2 are done in access functions putFloats() and putDouble() ## How was this patch tested? Changes have been tested to build successfully on s390x as well x86 platform to make sure build is successful. Closes #24861 from ketank-new/ketan_latest_v2.3.2. Authored-by: ketank-new <ketan22584@gmail.com> Signed-off-by: Sean Owen <sean.owen@databricks.com>
This commit is contained in:
parent
c83b3ddb56
commit
1a3858a769
|
@ -304,7 +304,7 @@ public final class Platform {
|
|||
static {
|
||||
boolean _unaligned;
|
||||
String arch = System.getProperty("os.arch", "");
|
||||
if (arch.equals("ppc64le") || arch.equals("ppc64")) {
|
||||
if (arch.equals("ppc64le") || arch.equals("ppc64") || arch.equals("s390x")) {
|
||||
// Since java.nio.Bits.unaligned() doesn't return true on ppc (See JDK-8165231), but
|
||||
// ppc64 and ppc64le support it
|
||||
_unaligned = true;
|
||||
|
|
|
@ -417,7 +417,7 @@ public final class OffHeapColumnVector extends WritableColumnVector {
|
|||
Platform.copyMemory(src, Platform.BYTE_ARRAY_OFFSET + srcIndex,
|
||||
null, data + rowId * 4L, count * 4L);
|
||||
} else {
|
||||
ByteBuffer bb = ByteBuffer.wrap(src).order(ByteOrder.LITTLE_ENDIAN);
|
||||
ByteBuffer bb = ByteBuffer.wrap(src).order(ByteOrder.BIG_ENDIAN);
|
||||
long offset = data + 4L * rowId;
|
||||
for (int i = 0; i < count; ++i, offset += 4) {
|
||||
Platform.putFloat(null, offset, bb.getFloat(srcIndex + (4 * i)));
|
||||
|
@ -472,7 +472,7 @@ public final class OffHeapColumnVector extends WritableColumnVector {
|
|||
Platform.copyMemory(src, Platform.BYTE_ARRAY_OFFSET + srcIndex,
|
||||
null, data + rowId * 8L, count * 8L);
|
||||
} else {
|
||||
ByteBuffer bb = ByteBuffer.wrap(src).order(ByteOrder.LITTLE_ENDIAN);
|
||||
ByteBuffer bb = ByteBuffer.wrap(src).order(ByteOrder.BIG_ENDIAN);
|
||||
long offset = data + 8L * rowId;
|
||||
for (int i = 0; i < count; ++i, offset += 8) {
|
||||
Platform.putDouble(null, offset, bb.getDouble(srcIndex + (8 * i)));
|
||||
|
|
|
@ -396,7 +396,7 @@ public final class OnHeapColumnVector extends WritableColumnVector {
|
|||
Platform.copyMemory(src, Platform.BYTE_ARRAY_OFFSET + srcIndex, floatData,
|
||||
Platform.DOUBLE_ARRAY_OFFSET + rowId * 4L, count * 4L);
|
||||
} else {
|
||||
ByteBuffer bb = ByteBuffer.wrap(src).order(ByteOrder.LITTLE_ENDIAN);
|
||||
ByteBuffer bb = ByteBuffer.wrap(src).order(ByteOrder.BIG_ENDIAN);
|
||||
for (int i = 0; i < count; ++i) {
|
||||
floatData[i + rowId] = bb.getFloat(srcIndex + (4 * i));
|
||||
}
|
||||
|
@ -445,7 +445,7 @@ public final class OnHeapColumnVector extends WritableColumnVector {
|
|||
Platform.copyMemory(src, Platform.BYTE_ARRAY_OFFSET + srcIndex, doubleData,
|
||||
Platform.DOUBLE_ARRAY_OFFSET + rowId * 8L, count * 8L);
|
||||
} else {
|
||||
ByteBuffer bb = ByteBuffer.wrap(src).order(ByteOrder.LITTLE_ENDIAN);
|
||||
ByteBuffer bb = ByteBuffer.wrap(src).order(ByteOrder.BIG_ENDIAN);
|
||||
for (int i = 0; i < count; ++i) {
|
||||
doubleData[i + rowId] = bb.getDouble(srcIndex + (8 * i));
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue