This is an automated email from the ASF dual-hosted git repository.
lzljs3620320 pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/paimon.git
The following commit(s) were added to refs/heads/master by this push:
new aee2b8b575 [orc] ORC can set useSelected, allowSARGToFilter to make
pushdown works under stripe (#4231)
aee2b8b575 is described below
commit aee2b8b575ee9b65b8a955262e125f510fbb0231
Author: ranxianglei <[email protected]>
AuthorDate: Tue Nov 12 15:33:21 2024 +0800
[orc] ORC can set useSelected, allowSARGToFilter to make pushdown works
under stripe (#4231)
---
.../src/main/java/org/apache/orc/OrcConf.java | 15 +++++++++
.../apache/paimon/format/orc/OrcFileFormat.java | 1 -
.../apache/paimon/format/orc/OrcReaderFactory.java | 12 +++++--
.../format/orc/reader/AbstractOrcColumnVector.java | 37 +++++++++++++++-------
.../format/orc/reader/OrcArrayColumnVector.java | 9 ++++--
.../format/orc/reader/OrcBytesColumnVector.java | 7 ++--
.../format/orc/reader/OrcDecimalColumnVector.java | 9 +++---
.../format/orc/reader/OrcDoubleColumnVector.java | 11 ++++---
.../orc/reader/OrcLegacyTimestampColumnVector.java | 9 +++---
.../format/orc/reader/OrcLongColumnVector.java | 20 ++++++++----
.../format/orc/reader/OrcMapColumnVector.java | 12 ++++---
.../format/orc/reader/OrcRowColumnVector.java | 10 ++++--
.../orc/reader/OrcTimestampColumnVector.java | 9 +++---
13 files changed, 110 insertions(+), 51 deletions(-)
diff --git a/paimon-format/src/main/java/org/apache/orc/OrcConf.java
b/paimon-format/src/main/java/org/apache/orc/OrcConf.java
index a7fa1a21bc..ee07e45117 100644
--- a/paimon-format/src/main/java/org/apache/orc/OrcConf.java
+++ b/paimon-format/src/main/java/org/apache/orc/OrcConf.java
@@ -305,6 +305,21 @@ public enum OrcConf {
+ "must have the filter\n"
+ "reapplied to avoid using unset values in the unselected
rows.\n"
+ "If unsure please leave this as false."),
+
+ READER_ONLY_ALLOW_SARG_TO_FILTER(
+ "orc.reader.sarg.to.filter",
+ "orc.reader.sarg.to.filter",
+ false,
+ "A boolean flag to determine if a SArg is allowed to become a
filter, only for reader."),
+ READER_ONLY_USE_SELECTED(
+ "orc.reader.filter.use.selected",
+ "orc.reader.filter.use.selected",
+ false,
+ "A boolean flag to determine if the selected vector is supported
by\n"
+ + "the reading application, only for reader. If false,
the output of the ORC reader "
+ + "must have the filter\n"
+ + "reapplied to avoid using unset values in the unselected
rows.\n"
+ + "If unsure please leave this as false."),
ALLOW_PLUGIN_FILTER(
"orc.filter.plugin",
"orc.filter.plugin",
diff --git
a/paimon-format/src/main/java/org/apache/paimon/format/orc/OrcFileFormat.java
b/paimon-format/src/main/java/org/apache/paimon/format/orc/OrcFileFormat.java
index 302b72f876..053f699580 100644
---
a/paimon-format/src/main/java/org/apache/paimon/format/orc/OrcFileFormat.java
+++
b/paimon-format/src/main/java/org/apache/paimon/format/orc/OrcFileFormat.java
@@ -101,7 +101,6 @@ public class OrcFileFormat extends FileFormat {
public FormatReaderFactory createReaderFactory(
RowType projectedRowType, @Nullable List<Predicate> filters) {
List<OrcFilters.Predicate> orcPredicates = new ArrayList<>();
-
if (filters != null) {
for (Predicate pred : filters) {
Optional<OrcFilters.Predicate> orcPred =
diff --git
a/paimon-format/src/main/java/org/apache/paimon/format/orc/OrcReaderFactory.java
b/paimon-format/src/main/java/org/apache/paimon/format/orc/OrcReaderFactory.java
index 4f41742405..5543fd7910 100644
---
a/paimon-format/src/main/java/org/apache/paimon/format/orc/OrcReaderFactory.java
+++
b/paimon-format/src/main/java/org/apache/paimon/format/orc/OrcReaderFactory.java
@@ -127,7 +127,9 @@ public class OrcReaderFactory implements
FormatReaderFactory {
for (int i = 0; i < vectors.length; i++) {
String name = tableFieldNames.get(i);
DataType type = tableFieldTypes.get(i);
- vectors[i] =
createPaimonVector(orcBatch.cols[tableFieldNames.indexOf(name)], type);
+ vectors[i] =
+ createPaimonVector(
+ orcBatch.cols[tableFieldNames.indexOf(name)],
orcBatch, type);
}
return new OrcReaderBatch(filePath, orcBatch, new
VectorizedColumnBatch(vectors), recycler);
}
@@ -273,7 +275,13 @@ public class OrcReaderFactory implements
FormatReaderFactory {
.skipCorruptRecords(OrcConf.SKIP_CORRUPT_DATA.getBoolean(conf))
.tolerateMissingSchema(
OrcConf.TOLERATE_MISSING_SCHEMA.getBoolean(conf));
-
+ if (!conjunctPredicates.isEmpty()) {
+ // TODO fix it , if open this option,future deletion vectors
would not work,
+ // cased by getRowNumber would be changed .
+
options.useSelected(OrcConf.READER_ONLY_USE_SELECTED.getBoolean(conf));
+ options.allowSARGToFilter(
+
OrcConf.READER_ONLY_ALLOW_SARG_TO_FILTER.getBoolean(conf));
+ }
// configure filters
if (!conjunctPredicates.isEmpty()) {
SearchArgument.Builder b = SearchArgumentFactory.newBuilder();
diff --git
a/paimon-format/src/main/java/org/apache/paimon/format/orc/reader/AbstractOrcColumnVector.java
b/paimon-format/src/main/java/org/apache/paimon/format/orc/reader/AbstractOrcColumnVector.java
index 21154c4967..0557a72230 100644
---
a/paimon-format/src/main/java/org/apache/paimon/format/orc/reader/AbstractOrcColumnVector.java
+++
b/paimon-format/src/main/java/org/apache/paimon/format/orc/reader/AbstractOrcColumnVector.java
@@ -33,6 +33,7 @@ import org.apache.hadoop.hive.ql.exec.vector.LongColumnVector;
import org.apache.hadoop.hive.ql.exec.vector.MapColumnVector;
import org.apache.hadoop.hive.ql.exec.vector.StructColumnVector;
import org.apache.hadoop.hive.ql.exec.vector.TimestampColumnVector;
+import org.apache.hadoop.hive.ql.exec.vector.VectorizedRowBatch;
/** This column vector is used to adapt hive's ColumnVector to Paimon's
ColumnVector. */
public abstract class AbstractOrcColumnVector
@@ -40,37 +41,49 @@ public abstract class AbstractOrcColumnVector
private final ColumnVector vector;
- AbstractOrcColumnVector(ColumnVector vector) {
+ private final VectorizedRowBatch orcBatch;
+
+ AbstractOrcColumnVector(ColumnVector vector, VectorizedRowBatch orcBatch) {
this.vector = vector;
+ this.orcBatch = orcBatch;
+ }
+
+ protected int rowMapper(int r) {
+ if (vector.isRepeating) {
+ return 0;
+ }
+ return this.orcBatch.selectedInUse ? this.orcBatch.getSelected()[r] :
r;
}
@Override
public boolean isNullAt(int i) {
- return !vector.noNulls && vector.isNull[vector.isRepeating ? 0 : i];
+ return !vector.noNulls && vector.isNull[rowMapper(i)];
}
public static org.apache.paimon.data.columnar.ColumnVector
createPaimonVector(
- ColumnVector vector, DataType dataType) {
+ ColumnVector vector, VectorizedRowBatch orcBatch, DataType
dataType) {
if (vector instanceof LongColumnVector) {
if (dataType.getTypeRoot() ==
DataTypeRoot.TIMESTAMP_WITHOUT_TIME_ZONE) {
- return new OrcLegacyTimestampColumnVector((LongColumnVector)
vector);
+ return new OrcLegacyTimestampColumnVector((LongColumnVector)
vector, orcBatch);
} else {
- return new OrcLongColumnVector((LongColumnVector) vector);
+ return new OrcLongColumnVector((LongColumnVector) vector,
orcBatch);
}
} else if (vector instanceof DoubleColumnVector) {
- return new OrcDoubleColumnVector((DoubleColumnVector) vector);
+ return new OrcDoubleColumnVector((DoubleColumnVector) vector,
orcBatch);
} else if (vector instanceof BytesColumnVector) {
- return new OrcBytesColumnVector((BytesColumnVector) vector);
+ return new OrcBytesColumnVector((BytesColumnVector) vector,
orcBatch);
} else if (vector instanceof DecimalColumnVector) {
- return new OrcDecimalColumnVector((DecimalColumnVector) vector);
+ return new OrcDecimalColumnVector((DecimalColumnVector) vector,
orcBatch);
} else if (vector instanceof TimestampColumnVector) {
- return new OrcTimestampColumnVector(vector);
+ return new OrcTimestampColumnVector(vector, orcBatch);
} else if (vector instanceof ListColumnVector) {
- return new OrcArrayColumnVector((ListColumnVector) vector,
(ArrayType) dataType);
+ return new OrcArrayColumnVector(
+ (ListColumnVector) vector, orcBatch, (ArrayType) dataType);
} else if (vector instanceof StructColumnVector) {
- return new OrcRowColumnVector((StructColumnVector) vector,
(RowType) dataType);
+ return new OrcRowColumnVector(
+ (StructColumnVector) vector, orcBatch, (RowType) dataType);
} else if (vector instanceof MapColumnVector) {
- return new OrcMapColumnVector((MapColumnVector) vector, (MapType)
dataType);
+ return new OrcMapColumnVector((MapColumnVector) vector, orcBatch,
(MapType) dataType);
} else {
throw new UnsupportedOperationException(
"Unsupported vector: " + vector.getClass().getName());
diff --git
a/paimon-format/src/main/java/org/apache/paimon/format/orc/reader/OrcArrayColumnVector.java
b/paimon-format/src/main/java/org/apache/paimon/format/orc/reader/OrcArrayColumnVector.java
index ed16a0b510..25a1935f3e 100644
---
a/paimon-format/src/main/java/org/apache/paimon/format/orc/reader/OrcArrayColumnVector.java
+++
b/paimon-format/src/main/java/org/apache/paimon/format/orc/reader/OrcArrayColumnVector.java
@@ -24,6 +24,7 @@ import org.apache.paimon.data.columnar.ColumnarArray;
import org.apache.paimon.types.ArrayType;
import org.apache.hadoop.hive.ql.exec.vector.ListColumnVector;
+import org.apache.hadoop.hive.ql.exec.vector.VectorizedRowBatch;
/** This column vector is used to adapt hive's ListColumnVector to Paimon's
ArrayColumnVector. */
public class OrcArrayColumnVector extends AbstractOrcColumnVector
@@ -32,14 +33,16 @@ public class OrcArrayColumnVector extends
AbstractOrcColumnVector
private final ListColumnVector hiveVector;
private final ColumnVector paimonVector;
- public OrcArrayColumnVector(ListColumnVector hiveVector, ArrayType type) {
- super(hiveVector);
+ public OrcArrayColumnVector(
+ ListColumnVector hiveVector, VectorizedRowBatch orcBatch,
ArrayType type) {
+ super(hiveVector, orcBatch);
this.hiveVector = hiveVector;
- this.paimonVector = createPaimonVector(hiveVector.child,
type.getElementType());
+ this.paimonVector = createPaimonVector(hiveVector.child, orcBatch,
type.getElementType());
}
@Override
public InternalArray getArray(int i) {
+ i = rowMapper(i);
long offset = hiveVector.offsets[i];
long length = hiveVector.lengths[i];
return new ColumnarArray(paimonVector, (int) offset, (int) length);
diff --git
a/paimon-format/src/main/java/org/apache/paimon/format/orc/reader/OrcBytesColumnVector.java
b/paimon-format/src/main/java/org/apache/paimon/format/orc/reader/OrcBytesColumnVector.java
index d48bad886a..7f812bb562 100644
---
a/paimon-format/src/main/java/org/apache/paimon/format/orc/reader/OrcBytesColumnVector.java
+++
b/paimon-format/src/main/java/org/apache/paimon/format/orc/reader/OrcBytesColumnVector.java
@@ -19,6 +19,7 @@
package org.apache.paimon.format.orc.reader;
import org.apache.hadoop.hive.ql.exec.vector.BytesColumnVector;
+import org.apache.hadoop.hive.ql.exec.vector.VectorizedRowBatch;
/** This column vector is used to adapt hive's BytesColumnVector to Paimon's
BytesColumnVector. */
public class OrcBytesColumnVector extends AbstractOrcColumnVector
@@ -26,14 +27,14 @@ public class OrcBytesColumnVector extends
AbstractOrcColumnVector
private final BytesColumnVector vector;
- public OrcBytesColumnVector(BytesColumnVector vector) {
- super(vector);
+ public OrcBytesColumnVector(BytesColumnVector vector, VectorizedRowBatch
orcBatch) {
+ super(vector, orcBatch);
this.vector = vector;
}
@Override
public Bytes getBytes(int i) {
- int rowId = vector.isRepeating ? 0 : i;
+ int rowId = rowMapper(i);
byte[][] data = vector.vector;
int[] start = vector.start;
int[] length = vector.length;
diff --git
a/paimon-format/src/main/java/org/apache/paimon/format/orc/reader/OrcDecimalColumnVector.java
b/paimon-format/src/main/java/org/apache/paimon/format/orc/reader/OrcDecimalColumnVector.java
index 9ea4d763a5..382c19f45b 100644
---
a/paimon-format/src/main/java/org/apache/paimon/format/orc/reader/OrcDecimalColumnVector.java
+++
b/paimon-format/src/main/java/org/apache/paimon/format/orc/reader/OrcDecimalColumnVector.java
@@ -21,6 +21,7 @@ package org.apache.paimon.format.orc.reader;
import org.apache.paimon.data.Decimal;
import org.apache.hadoop.hive.ql.exec.vector.DecimalColumnVector;
+import org.apache.hadoop.hive.ql.exec.vector.VectorizedRowBatch;
import java.math.BigDecimal;
@@ -32,15 +33,15 @@ public class OrcDecimalColumnVector extends
AbstractOrcColumnVector
private final DecimalColumnVector vector;
- public OrcDecimalColumnVector(DecimalColumnVector vector) {
- super(vector);
+ public OrcDecimalColumnVector(DecimalColumnVector vector,
VectorizedRowBatch orcBatch) {
+ super(vector, orcBatch);
this.vector = vector;
}
@Override
public Decimal getDecimal(int i, int precision, int scale) {
- BigDecimal data =
- vector.vector[vector.isRepeating ? 0 :
i].getHiveDecimal().bigDecimalValue();
+ i = rowMapper(i);
+ BigDecimal data = vector.vector[i].getHiveDecimal().bigDecimalValue();
return Decimal.fromBigDecimal(data, precision, scale);
}
}
diff --git
a/paimon-format/src/main/java/org/apache/paimon/format/orc/reader/OrcDoubleColumnVector.java
b/paimon-format/src/main/java/org/apache/paimon/format/orc/reader/OrcDoubleColumnVector.java
index 0c0b0cc51d..f26dac6de9 100644
---
a/paimon-format/src/main/java/org/apache/paimon/format/orc/reader/OrcDoubleColumnVector.java
+++
b/paimon-format/src/main/java/org/apache/paimon/format/orc/reader/OrcDoubleColumnVector.java
@@ -19,6 +19,7 @@
package org.apache.paimon.format.orc.reader;
import org.apache.hadoop.hive.ql.exec.vector.DoubleColumnVector;
+import org.apache.hadoop.hive.ql.exec.vector.VectorizedRowBatch;
/**
* This column vector is used to adapt hive's DoubleColumnVector to Paimon's
float and double
@@ -30,18 +31,20 @@ public class OrcDoubleColumnVector extends
AbstractOrcColumnVector
private final DoubleColumnVector vector;
- public OrcDoubleColumnVector(DoubleColumnVector vector) {
- super(vector);
+ public OrcDoubleColumnVector(DoubleColumnVector vector, VectorizedRowBatch
orcBatch) {
+ super(vector, orcBatch);
this.vector = vector;
}
@Override
public double getDouble(int i) {
- return vector.vector[vector.isRepeating ? 0 : i];
+ i = rowMapper(i);
+ return vector.vector[i];
}
@Override
public float getFloat(int i) {
- return (float) vector.vector[vector.isRepeating ? 0 : i];
+ i = rowMapper(i);
+ return (float) vector.vector[i];
}
}
diff --git
a/paimon-format/src/main/java/org/apache/paimon/format/orc/reader/OrcLegacyTimestampColumnVector.java
b/paimon-format/src/main/java/org/apache/paimon/format/orc/reader/OrcLegacyTimestampColumnVector.java
index 18227ecf3d..5107e722ed 100644
---
a/paimon-format/src/main/java/org/apache/paimon/format/orc/reader/OrcLegacyTimestampColumnVector.java
+++
b/paimon-format/src/main/java/org/apache/paimon/format/orc/reader/OrcLegacyTimestampColumnVector.java
@@ -22,6 +22,7 @@ import org.apache.paimon.data.Timestamp;
import org.apache.hadoop.hive.ql.exec.vector.ColumnVector;
import org.apache.hadoop.hive.ql.exec.vector.LongColumnVector;
+import org.apache.hadoop.hive.ql.exec.vector.VectorizedRowBatch;
import java.time.LocalDateTime;
@@ -34,15 +35,15 @@ public class OrcLegacyTimestampColumnVector extends
AbstractOrcColumnVector
private final LongColumnVector hiveVector;
- OrcLegacyTimestampColumnVector(LongColumnVector vector) {
- super(vector);
+ OrcLegacyTimestampColumnVector(LongColumnVector vector, VectorizedRowBatch
orcBatch) {
+ super(vector, orcBatch);
this.hiveVector = vector;
}
@Override
public Timestamp getTimestamp(int i, int precision) {
- int index = hiveVector.isRepeating ? 0 : i;
- java.sql.Timestamp timestamp = toTimestamp(hiveVector.vector[index]);
+ i = rowMapper(i);
+ java.sql.Timestamp timestamp = toTimestamp(hiveVector.vector[i]);
return Timestamp.fromSQLTimestamp(timestamp);
}
diff --git
a/paimon-format/src/main/java/org/apache/paimon/format/orc/reader/OrcLongColumnVector.java
b/paimon-format/src/main/java/org/apache/paimon/format/orc/reader/OrcLongColumnVector.java
index e7dfe0e613..c289b74c58 100644
---
a/paimon-format/src/main/java/org/apache/paimon/format/orc/reader/OrcLongColumnVector.java
+++
b/paimon-format/src/main/java/org/apache/paimon/format/orc/reader/OrcLongColumnVector.java
@@ -19,6 +19,7 @@
package org.apache.paimon.format.orc.reader;
import org.apache.hadoop.hive.ql.exec.vector.LongColumnVector;
+import org.apache.hadoop.hive.ql.exec.vector.VectorizedRowBatch;
/**
* This column vector is used to adapt hive's LongColumnVector to Paimon's
boolean, byte, short, int
@@ -33,33 +34,38 @@ public class OrcLongColumnVector extends
AbstractOrcColumnVector
private final LongColumnVector vector;
- public OrcLongColumnVector(LongColumnVector vector) {
- super(vector);
+ public OrcLongColumnVector(LongColumnVector vector, VectorizedRowBatch
orcBatch) {
+ super(vector, orcBatch);
this.vector = vector;
}
@Override
public long getLong(int i) {
- return vector.vector[vector.isRepeating ? 0 : i];
+ i = rowMapper(i);
+ return vector.vector[i];
}
@Override
public boolean getBoolean(int i) {
- return vector.vector[vector.isRepeating ? 0 : i] == 1;
+ i = rowMapper(i);
+ return vector.vector[i] == 1;
}
@Override
public byte getByte(int i) {
- return (byte) vector.vector[vector.isRepeating ? 0 : i];
+ i = rowMapper(i);
+ return (byte) vector.vector[i];
}
@Override
public int getInt(int i) {
- return (int) vector.vector[vector.isRepeating ? 0 : i];
+ i = rowMapper(i);
+ return (int) vector.vector[i];
}
@Override
public short getShort(int i) {
- return (short) vector.vector[vector.isRepeating ? 0 : i];
+ i = rowMapper(i);
+ return (short) vector.vector[i];
}
}
diff --git
a/paimon-format/src/main/java/org/apache/paimon/format/orc/reader/OrcMapColumnVector.java
b/paimon-format/src/main/java/org/apache/paimon/format/orc/reader/OrcMapColumnVector.java
index 66a1af6dcc..c7245275fd 100644
---
a/paimon-format/src/main/java/org/apache/paimon/format/orc/reader/OrcMapColumnVector.java
+++
b/paimon-format/src/main/java/org/apache/paimon/format/orc/reader/OrcMapColumnVector.java
@@ -24,6 +24,7 @@ import org.apache.paimon.data.columnar.ColumnarMap;
import org.apache.paimon.types.MapType;
import org.apache.hadoop.hive.ql.exec.vector.MapColumnVector;
+import org.apache.hadoop.hive.ql.exec.vector.VectorizedRowBatch;
/** This column vector is used to adapt hive's MapColumnVector to Paimon's
MapColumnVector. */
public class OrcMapColumnVector extends AbstractOrcColumnVector
@@ -33,15 +34,18 @@ public class OrcMapColumnVector extends
AbstractOrcColumnVector
private final ColumnVector keyPaimonVector;
private final ColumnVector valuePaimonVector;
- public OrcMapColumnVector(MapColumnVector hiveVector, MapType type) {
- super(hiveVector);
+ public OrcMapColumnVector(
+ MapColumnVector hiveVector, VectorizedRowBatch orcBatch, MapType
type) {
+ super(hiveVector, orcBatch);
this.hiveVector = hiveVector;
- this.keyPaimonVector = createPaimonVector(hiveVector.keys,
type.getKeyType());
- this.valuePaimonVector = createPaimonVector(hiveVector.values,
type.getValueType());
+ this.keyPaimonVector = createPaimonVector(hiveVector.keys, orcBatch,
type.getKeyType());
+ this.valuePaimonVector =
+ createPaimonVector(hiveVector.values, orcBatch,
type.getValueType());
}
@Override
public InternalMap getMap(int i) {
+ i = rowMapper(i);
long offset = hiveVector.offsets[i];
long length = hiveVector.lengths[i];
return new ColumnarMap(keyPaimonVector, valuePaimonVector, (int)
offset, (int) length);
diff --git
a/paimon-format/src/main/java/org/apache/paimon/format/orc/reader/OrcRowColumnVector.java
b/paimon-format/src/main/java/org/apache/paimon/format/orc/reader/OrcRowColumnVector.java
index caa22467f9..6c73c9fdbe 100644
---
a/paimon-format/src/main/java/org/apache/paimon/format/orc/reader/OrcRowColumnVector.java
+++
b/paimon-format/src/main/java/org/apache/paimon/format/orc/reader/OrcRowColumnVector.java
@@ -24,6 +24,7 @@ import org.apache.paimon.data.columnar.VectorizedColumnBatch;
import org.apache.paimon.types.RowType;
import org.apache.hadoop.hive.ql.exec.vector.StructColumnVector;
+import org.apache.hadoop.hive.ql.exec.vector.VectorizedRowBatch;
/** This column vector is used to adapt hive's StructColumnVector to Flink's
RowColumnVector. */
public class OrcRowColumnVector extends AbstractOrcColumnVector
@@ -31,18 +32,21 @@ public class OrcRowColumnVector extends
AbstractOrcColumnVector
private final VectorizedColumnBatch batch;
- public OrcRowColumnVector(StructColumnVector hiveVector, RowType type) {
- super(hiveVector);
+ public OrcRowColumnVector(
+ StructColumnVector hiveVector, VectorizedRowBatch orcBatch,
RowType type) {
+ super(hiveVector, orcBatch);
int len = hiveVector.fields.length;
ColumnVector[] paimonVectors = new ColumnVector[len];
for (int i = 0; i < len; i++) {
- paimonVectors[i] = createPaimonVector(hiveVector.fields[i],
type.getTypeAt(i));
+ paimonVectors[i] =
+ createPaimonVector(hiveVector.fields[i], orcBatch,
type.getTypeAt(i));
}
this.batch = new VectorizedColumnBatch(paimonVectors);
}
@Override
public ColumnarRow getRow(int i) {
+ i = rowMapper(i);
return new ColumnarRow(batch, i);
}
diff --git
a/paimon-format/src/main/java/org/apache/paimon/format/orc/reader/OrcTimestampColumnVector.java
b/paimon-format/src/main/java/org/apache/paimon/format/orc/reader/OrcTimestampColumnVector.java
index dd8ac08f2f..a6e71d6016 100644
---
a/paimon-format/src/main/java/org/apache/paimon/format/orc/reader/OrcTimestampColumnVector.java
+++
b/paimon-format/src/main/java/org/apache/paimon/format/orc/reader/OrcTimestampColumnVector.java
@@ -23,6 +23,7 @@ import org.apache.paimon.utils.DateTimeUtils;
import org.apache.hadoop.hive.ql.exec.vector.ColumnVector;
import org.apache.hadoop.hive.ql.exec.vector.TimestampColumnVector;
+import org.apache.hadoop.hive.ql.exec.vector.VectorizedRowBatch;
/**
* This column vector is used to adapt hive's TimestampColumnVector to Paimon's
@@ -33,14 +34,14 @@ public class OrcTimestampColumnVector extends
AbstractOrcColumnVector
private final TimestampColumnVector vector;
- public OrcTimestampColumnVector(ColumnVector vector) {
- super(vector);
+ public OrcTimestampColumnVector(ColumnVector vector, VectorizedRowBatch
orcBatch) {
+ super(vector, orcBatch);
this.vector = (TimestampColumnVector) vector;
}
@Override
public Timestamp getTimestamp(int i, int precision) {
- int index = vector.isRepeating ? 0 : i;
- return DateTimeUtils.toInternal(vector.time[index],
vector.nanos[index] % 1_000_000);
+ i = rowMapper(i);
+ return DateTimeUtils.toInternal(vector.time[i], vector.nanos[i] %
1_000_000);
}
}