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 d80f51417 [arrow] Enable upper-case field name in arrow format writer 
(#4263)
d80f51417 is described below

commit d80f51417fad76c43f5cf531575b9d17b33593ee
Author: YeJunHao <[email protected]>
AuthorDate: Thu Sep 26 15:19:27 2024 +0800

    [arrow] Enable upper-case field name in arrow format writer (#4263)
---
 .../src/main/java/org/apache/paimon/arrow/ArrowBundleRecords.java | 7 +++++--
 .../paimon/arrow/converter/Arrow2PaimonVectorConverter.java       | 4 ++--
 .../java/org/apache/paimon/arrow/reader/ArrowBatchReader.java     | 8 ++++++--
 .../java/org/apache/paimon/arrow/vector/ArrowFormatWriter.java    | 5 +++++
 .../org/apache/paimon/arrow/vector/ArrowFormatWriterTest.java     | 8 ++++----
 .../paimon/arrow/vector/OneElementFieldVectorGeneratorTest.java   | 6 +++---
 6 files changed, 25 insertions(+), 13 deletions(-)

diff --git 
a/paimon-arrow/src/main/java/org/apache/paimon/arrow/ArrowBundleRecords.java 
b/paimon-arrow/src/main/java/org/apache/paimon/arrow/ArrowBundleRecords.java
index 073672c75..84dfb875e 100644
--- a/paimon-arrow/src/main/java/org/apache/paimon/arrow/ArrowBundleRecords.java
+++ b/paimon-arrow/src/main/java/org/apache/paimon/arrow/ArrowBundleRecords.java
@@ -32,10 +32,13 @@ public class ArrowBundleRecords implements BundleRecords {
 
     private final VectorSchemaRoot vectorSchemaRoot;
     private final RowType rowType;
+    private final boolean onlyLowerCase;
 
-    public ArrowBundleRecords(VectorSchemaRoot vectorSchemaRoot, RowType 
rowType) {
+    public ArrowBundleRecords(
+            VectorSchemaRoot vectorSchemaRoot, RowType rowType, boolean 
onlyLowerCase) {
         this.vectorSchemaRoot = vectorSchemaRoot;
         this.rowType = rowType;
+        this.onlyLowerCase = onlyLowerCase;
     }
 
     public VectorSchemaRoot getVectorSchemaRoot() {
@@ -49,7 +52,7 @@ public class ArrowBundleRecords implements BundleRecords {
 
     @Override
     public Iterator<InternalRow> iterator() {
-        ArrowBatchReader arrowBatchReader = new ArrowBatchReader(rowType);
+        ArrowBatchReader arrowBatchReader = new ArrowBatchReader(rowType, 
onlyLowerCase);
         return arrowBatchReader.readBatch(vectorSchemaRoot).iterator();
     }
 }
diff --git 
a/paimon-arrow/src/main/java/org/apache/paimon/arrow/converter/Arrow2PaimonVectorConverter.java
 
b/paimon-arrow/src/main/java/org/apache/paimon/arrow/converter/Arrow2PaimonVectorConverter.java
index 6536ae924..2bcaab50b 100644
--- 
a/paimon-arrow/src/main/java/org/apache/paimon/arrow/converter/Arrow2PaimonVectorConverter.java
+++ 
b/paimon-arrow/src/main/java/org/apache/paimon/arrow/converter/Arrow2PaimonVectorConverter.java
@@ -390,7 +390,7 @@ public interface Arrow2PaimonVectorConverter {
                                 return Timestamp.fromMicros(value);
                             } else {
                                 return Timestamp.fromEpochMillis(
-                                        value / 1_000_000, (int) value % 
1_000_000);
+                                        value / 1_000_000, (int) (value % 
1_000_000));
                             }
                         }
                     };
@@ -417,7 +417,7 @@ public interface Arrow2PaimonVectorConverter {
                                 return Timestamp.fromMicros(value);
                             } else {
                                 return Timestamp.fromEpochMillis(
-                                        value / 1_000_000, (int) value % 
1_000_000);
+                                        value / 1_000_000, (int) (value % 
1_000_000));
                             }
                         }
                     };
diff --git 
a/paimon-arrow/src/main/java/org/apache/paimon/arrow/reader/ArrowBatchReader.java
 
b/paimon-arrow/src/main/java/org/apache/paimon/arrow/reader/ArrowBatchReader.java
index 364bf4884..a349dfff0 100644
--- 
a/paimon-arrow/src/main/java/org/apache/paimon/arrow/reader/ArrowBatchReader.java
+++ 
b/paimon-arrow/src/main/java/org/apache/paimon/arrow/reader/ArrowBatchReader.java
@@ -41,8 +41,9 @@ public class ArrowBatchReader {
     private final VectorizedColumnBatch batch;
     private final Arrow2PaimonVectorConverter[] convertors;
     private final RowType projectedRowType;
+    private final boolean toLowerCase;
 
-    public ArrowBatchReader(RowType rowType) {
+    public ArrowBatchReader(RowType rowType, boolean toLowerCase) {
         this.internalRowSerializer = new InternalRowSerializer(rowType);
         ColumnVector[] columnVectors = new 
ColumnVector[rowType.getFieldCount()];
         this.convertors = new 
Arrow2PaimonVectorConverter[rowType.getFieldCount()];
@@ -52,6 +53,7 @@ public class ArrowBatchReader {
         for (int i = 0; i < columnVectors.length; i++) {
             this.convertors[i] = 
Arrow2PaimonVectorConverter.construct(rowType.getTypeAt(i));
         }
+        this.toLowerCase = toLowerCase;
     }
 
     public Iterable<InternalRow> readBatch(VectorSchemaRoot vsr) {
@@ -60,7 +62,9 @@ public class ArrowBatchReader {
         List<DataField> dataFields = projectedRowType.getFields();
         for (int i = 0; i < dataFields.size(); ++i) {
             try {
-                Field field = 
arrowSchema.findField(dataFields.get(i).name().toLowerCase());
+                String fieldName = dataFields.get(i).name();
+                Field field =
+                        arrowSchema.findField(toLowerCase ? 
fieldName.toLowerCase() : fieldName);
                 int idx = arrowSchema.getFields().indexOf(field);
                 mapping[i] = idx;
             } catch (IllegalArgumentException e) {
diff --git 
a/paimon-arrow/src/main/java/org/apache/paimon/arrow/vector/ArrowFormatWriter.java
 
b/paimon-arrow/src/main/java/org/apache/paimon/arrow/vector/ArrowFormatWriter.java
index dde2500d8..acdb5d0dc 100644
--- 
a/paimon-arrow/src/main/java/org/apache/paimon/arrow/vector/ArrowFormatWriter.java
+++ 
b/paimon-arrow/src/main/java/org/apache/paimon/arrow/vector/ArrowFormatWriter.java
@@ -27,10 +27,14 @@ import org.apache.paimon.types.RowType;
 import org.apache.arrow.memory.RootAllocator;
 import org.apache.arrow.vector.VectorSchemaRoot;
 import org.apache.arrow.vector.util.OversizedAllocationException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 /** Write from {@link InternalRow} to {@link VectorSchemaRoot}. */
 public class ArrowFormatWriter implements AutoCloseable {
 
+    private static final Logger LOG = 
LoggerFactory.getLogger(ArrowFormatWriter.class);
+
     private final VectorSchemaRoot vectorSchemaRoot;
     private final ArrowFieldWriter[] fieldWriters;
 
@@ -72,6 +76,7 @@ public class ArrowFormatWriter implements AutoCloseable {
                 fieldWriters[i].write(rowId, currentRow, i);
             } catch (OversizedAllocationException | IndexOutOfBoundsException 
e) {
                 // maybe out of memory
+                LOG.warn("Arrow field writer failed while writing", e);
                 return false;
             }
         }
diff --git 
a/paimon-arrow/src/test/java/org/apache/paimon/arrow/vector/ArrowFormatWriterTest.java
 
b/paimon-arrow/src/test/java/org/apache/paimon/arrow/vector/ArrowFormatWriterTest.java
index 5892616f1..0b6cb7eca 100644
--- 
a/paimon-arrow/src/test/java/org/apache/paimon/arrow/vector/ArrowFormatWriterTest.java
+++ 
b/paimon-arrow/src/test/java/org/apache/paimon/arrow/vector/ArrowFormatWriterTest.java
@@ -100,7 +100,7 @@ public class ArrowFormatWriterTest {
             writer.flush();
             VectorSchemaRoot vectorSchemaRoot = writer.getVectorSchemaRoot();
 
-            ArrowBatchReader arrowBatchReader = new 
ArrowBatchReader(PRIMITIVE_TYPE);
+            ArrowBatchReader arrowBatchReader = new 
ArrowBatchReader(PRIMITIVE_TYPE, true);
             Iterable<InternalRow> rows = 
arrowBatchReader.readBatch(vectorSchemaRoot);
 
             Iterator<InternalRow> iterator = rows.iterator();
@@ -142,7 +142,7 @@ public class ArrowFormatWriterTest {
             }
             vectors.set(vectors.size() - 1, vector0);
 
-            ArrowBatchReader arrowBatchReader = new 
ArrowBatchReader(PRIMITIVE_TYPE);
+            ArrowBatchReader arrowBatchReader = new 
ArrowBatchReader(PRIMITIVE_TYPE, true);
             Iterable<InternalRow> rows = arrowBatchReader.readBatch(new 
VectorSchemaRoot(vectors));
 
             Iterator<InternalRow> iterator = rows.iterator();
@@ -177,7 +177,7 @@ public class ArrowFormatWriterTest {
             VectorSchemaRoot vectorSchemaRoot = writer.getVectorSchemaRoot();
 
             Iterator<InternalRow> iterator =
-                    new ArrowBundleRecords(vectorSchemaRoot, 
PRIMITIVE_TYPE).iterator();
+                    new ArrowBundleRecords(vectorSchemaRoot, PRIMITIVE_TYPE, 
true).iterator();
             for (int i = 0; i < 1000; i++) {
                 InternalRow actual = iterator.next();
                 InternalRow expectec = list.get(i);
@@ -208,7 +208,7 @@ public class ArrowFormatWriterTest {
             writer.flush();
             VectorSchemaRoot vectorSchemaRoot = writer.getVectorSchemaRoot();
 
-            ArrowBatchReader arrowBatchReader = new 
ArrowBatchReader(PRIMITIVE_TYPE);
+            ArrowBatchReader arrowBatchReader = new 
ArrowBatchReader(PRIMITIVE_TYPE, true);
             Iterable<InternalRow> rows = 
arrowBatchReader.readBatch(vectorSchemaRoot);
 
             Iterator<InternalRow> iterator = rows.iterator();
diff --git 
a/paimon-arrow/src/test/java/org/apache/paimon/arrow/vector/OneElementFieldVectorGeneratorTest.java
 
b/paimon-arrow/src/test/java/org/apache/paimon/arrow/vector/OneElementFieldVectorGeneratorTest.java
index e9b672e8f..a417133da 100644
--- 
a/paimon-arrow/src/test/java/org/apache/paimon/arrow/vector/OneElementFieldVectorGeneratorTest.java
+++ 
b/paimon-arrow/src/test/java/org/apache/paimon/arrow/vector/OneElementFieldVectorGeneratorTest.java
@@ -49,7 +49,7 @@ public class OneElementFieldVectorGeneratorTest {
                     new OneElementFieldVectorGenerator(rootAllocator, 
dataField, value);
             try (FieldVector fieldVector = 
oneElementFieldVectorGenerator.get(10000)) {
                 ArrowBatchReader reader =
-                        new ArrowBatchReader(new 
RowType(Arrays.asList(dataField)));
+                        new ArrowBatchReader(new 
RowType(Arrays.asList(dataField)), true);
                 Iterable<InternalRow> it =
                         reader.readBatch(new 
VectorSchemaRoot(Arrays.asList(fieldVector)));
                 it.forEach(
@@ -68,7 +68,7 @@ public class OneElementFieldVectorGeneratorTest {
                     new OneElementFieldVectorGenerator(rootAllocator, 
dataField, value)) {
                 FieldVector fieldVector = 
oneElementFieldVectorGenerator.get(10000);
                 ArrowBatchReader reader =
-                        new ArrowBatchReader(new 
RowType(Arrays.asList(dataField)));
+                        new ArrowBatchReader(new 
RowType(Arrays.asList(dataField)), true);
                 Iterable<InternalRow> it =
                         reader.readBatch(new 
VectorSchemaRoot(Arrays.asList(fieldVector)));
                 it.forEach(i -> 
Assertions.assertThat(i.getInt(0)).isEqualTo(genericRow.getInt(0)));
@@ -85,7 +85,7 @@ public class OneElementFieldVectorGeneratorTest {
             try (FieldVector fieldVector = 
oneElementFieldVectorGenerator.get(100000)) {
                 
Assertions.assertThat(fieldVector.getValueCount()).isEqualTo(100000);
                 ArrowBatchReader reader =
-                        new ArrowBatchReader(new 
RowType(Arrays.asList(dataField)));
+                        new ArrowBatchReader(new 
RowType(Arrays.asList(dataField)), true);
                 Iterable<InternalRow> it =
                         reader.readBatch(new 
VectorSchemaRoot(Arrays.asList(fieldVector)));
                 it.forEach(

Reply via email to