This is an automated email from the ASF dual-hosted git repository.

lzljs3620320 pushed a commit to branch release-0.6
in repository https://gitbox.apache.org/repos/asf/incubator-paimon.git

commit 99c2200e0c082abc26214184a73a4382d58d2a8a
Author: leoyy0316 <[email protected]>
AuthorDate: Mon Dec 25 15:55:15 2023 +0800

    [parquet] Fix timestamp type write parquet file not have logicaltype (#2558)
---
 .../format/parquet/ParquetSchemaConverter.java     | 23 ++++++++++++++--------
 1 file changed, 15 insertions(+), 8 deletions(-)

diff --git 
a/paimon-format/src/main/java/org/apache/paimon/format/parquet/ParquetSchemaConverter.java
 
b/paimon-format/src/main/java/org/apache/paimon/format/parquet/ParquetSchemaConverter.java
index 4ebc3e1bf..24160df56 100644
--- 
a/paimon-format/src/main/java/org/apache/paimon/format/parquet/ParquetSchemaConverter.java
+++ 
b/paimon-format/src/main/java/org/apache/paimon/format/parquet/ParquetSchemaConverter.java
@@ -114,16 +114,12 @@ public class ParquetSchemaConverter {
                 return Types.primitive(INT32, 
repetition).as(OriginalType.TIME_MILLIS).named(name);
             case TIMESTAMP_WITHOUT_TIME_ZONE:
                 TimestampType timestampType = (TimestampType) type;
-                return timestampType.getPrecision() <= 6
-                        ? Types.primitive(INT64, repetition).named(name)
-                        : 
Types.primitive(PrimitiveType.PrimitiveTypeName.INT96, repetition)
-                                .named(name);
+                return createTimestampWithLogicalType(
+                        name, timestampType.getPrecision(), repetition);
             case TIMESTAMP_WITH_LOCAL_TIME_ZONE:
                 LocalZonedTimestampType localZonedTimestampType = 
(LocalZonedTimestampType) type;
-                return localZonedTimestampType.getPrecision() <= 6
-                        ? Types.primitive(INT64, repetition).named(name)
-                        : 
Types.primitive(PrimitiveType.PrimitiveTypeName.INT96, repetition)
-                                .named(name);
+                return createTimestampWithLogicalType(
+                        name, localZonedTimestampType.getPrecision(), 
repetition);
             case ARRAY:
                 ArrayType arrayType = (ArrayType) type;
                 return ConversionPatterns.listOfElements(
@@ -154,6 +150,17 @@ public class ParquetSchemaConverter {
         }
     }
 
+    private static Type createTimestampWithLogicalType(
+            String name, int precision, Type.Repetition repetition) {
+        if (precision <= 3) {
+            return Types.primitive(INT64, 
repetition).as(OriginalType.TIMESTAMP_MILLIS).named(name);
+        } else if (precision > 6) {
+            return Types.primitive(PrimitiveType.PrimitiveTypeName.INT96, 
repetition).named(name);
+        } else {
+            return Types.primitive(INT64, 
repetition).as(OriginalType.TIMESTAMP_MICROS).named(name);
+        }
+    }
+
     private static List<Type> convertToParquetTypes(RowType rowType) {
         List<Type> types = new ArrayList<>(rowType.getFieldCount());
         for (int i = 0; i < rowType.getFieldCount(); i++) {

Reply via email to