From b4c28aa29f8df8175207e0e8623c95c9c1cacad1 Mon Sep 17 00:00:00 2001 From: jackywoo Date: Tue, 2 Apr 2019 10:56:48 +0800 Subject: [PATCH] KYLIN-3930 ArrayIndexOutOfBoundsException when building with unshard cube --- .../java/org/apache/kylin/cube/common/RowKeySplitter.java | 8 ++++++++ .../apache/kylin/engine/mr/common/NDCuboidBuilder.java | 3 +-- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/core-cube/src/main/java/org/apache/kylin/cube/common/RowKeySplitter.java b/core-cube/src/main/java/org/apache/kylin/cube/common/RowKeySplitter.java index 264c7a59b..b8d19213c 100644 --- a/core-cube/src/main/java/org/apache/kylin/cube/common/RowKeySplitter.java +++ b/core-cube/src/main/java/org/apache/kylin/cube/common/RowKeySplitter.java @@ -58,6 +58,14 @@ public class RowKeySplitter implements java.io.Serializable { } } + public int getHeaderLength() { + if (enableSharding) { + return RowConstants.ROWKEY_SHARDID_LEN + RowConstants.ROWKEY_CUBOIDID_LEN;//shard+cuboid + } else { + return RowConstants.ROWKEY_CUBOIDID_LEN;//cuboid + } + } + public int getBufferSize() { return bufferSize; } diff --git a/engine-mr/src/main/java/org/apache/kylin/engine/mr/common/NDCuboidBuilder.java b/engine-mr/src/main/java/org/apache/kylin/engine/mr/common/NDCuboidBuilder.java index 6ad261982..8d5d52af9 100644 --- a/engine-mr/src/main/java/org/apache/kylin/engine/mr/common/NDCuboidBuilder.java +++ b/engine-mr/src/main/java/org/apache/kylin/engine/mr/common/NDCuboidBuilder.java @@ -25,7 +25,6 @@ import org.apache.kylin.common.util.Pair; import org.apache.kylin.cube.CubeSegment; import org.apache.kylin.cube.common.RowKeySplitter; import org.apache.kylin.cube.cuboid.Cuboid; -import org.apache.kylin.cube.kv.RowConstants; import org.apache.kylin.cube.kv.RowKeyEncoder; import org.apache.kylin.cube.kv.RowKeyEncoderProvider; import org.slf4j.Logger; @@ -97,7 +96,7 @@ public class NDCuboidBuilder implements Serializable { long childCuboidId = childCuboid.getId(); long parentCuboidIdActualLength = (long)Long.SIZE - Long.numberOfLeadingZeros(parentCuboid.getId()); int index = rowKeySplitter.getBodySplitOffset(); // skip shard and cuboidId - int offset = RowConstants.ROWKEY_SHARDID_LEN + RowConstants.ROWKEY_CUBOIDID_LEN; // skip shard and cuboidId + int offset = rowKeySplitter.getHeaderLength(); // skip shard and cuboidId for (int i = 0; i < parentCuboidIdActualLength; i++) { if ((mask & parentCuboidId) > 0) {// if the this bit position equals // 1 -- 2.19.2.windows.1