diff --git a/iceberg/iceberg-handler/src/main/java/org/apache/iceberg/mr/hive/serde/objectinspector/IcebergTimestampObjectInspectorHive3.java b/iceberg/iceberg-handler/src/main/java/org/apache/iceberg/mr/hive/serde/objectinspector/IcebergTimestampObjectInspectorHive3.java index 86ecc929a5fa..f2e5c12dab8a 100644 --- a/iceberg/iceberg-handler/src/main/java/org/apache/iceberg/mr/hive/serde/objectinspector/IcebergTimestampObjectInspectorHive3.java +++ b/iceberg/iceberg-handler/src/main/java/org/apache/iceberg/mr/hive/serde/objectinspector/IcebergTimestampObjectInspectorHive3.java @@ -20,6 +20,7 @@ package org.apache.iceberg.mr.hive.serde.objectinspector; import java.time.LocalDateTime; +import java.time.OffsetDateTime; import java.time.ZoneOffset; import org.apache.hadoop.hive.common.type.Timestamp; import org.apache.hadoop.hive.serde2.io.TimestampWritableV2; @@ -55,7 +56,16 @@ public Timestamp getPrimitiveJavaObject(Object o) { if (o == null) { return null; } - LocalDateTime time = (LocalDateTime) o; + LocalDateTime time; + if (o instanceof LocalDateTime) { + time = (LocalDateTime) o; + } else if (o instanceof OffsetDateTime) { + OffsetDateTime odt = (OffsetDateTime) o; + time = odt.atZoneSameInstant(TypeInfoFactory.timestampLocalTZTypeInfo.getTimeZone()).toLocalDateTime(); + } else { + throw new ClassCastException(String.format("An unexpected type %s was passed as timestamp. " + + "Expected LocalDateTime/OffsetDateTime", o.getClass().getName())); + } return Timestamp.ofEpochMilli(time.toInstant(ZoneOffset.UTC).toEpochMilli(), time.getNano()); } diff --git a/iceberg/iceberg-handler/src/test/queries/positive/iceberg_inplace_migration_with_timestamp_column.q b/iceberg/iceberg-handler/src/test/queries/positive/iceberg_inplace_migration_with_timestamp_column.q new file mode 100644 index 000000000000..c5a5af3d0959 --- /dev/null +++ b/iceberg/iceberg-handler/src/test/queries/positive/iceberg_inplace_migration_with_timestamp_column.q @@ -0,0 +1,7 @@ +CREATE EXTERNAL TABLE hive_28518_test(`id` int,`name` string,`dt` timestamp) STORED AS PARQUET; +insert into hive_28518_test values (1, "test name" , cast('2024-08-09 14:08:26.326107' as timestamp)); +ALTER TABLE hive_28518_test SET TBLPROPERTIES ('storage_handler'='org.apache.iceberg.mr.hive.HiveIcebergStorageHandler', 'format-version' = '2'); +set hive.fetch.task.conversion=more; +select * from hive_28518_test; +set hive.fetch.task.conversion=none; +select * from hive_28518_test; \ No newline at end of file diff --git a/iceberg/iceberg-handler/src/test/results/positive/iceberg_inplace_migration_with_timestamp_column.q.out b/iceberg/iceberg-handler/src/test/results/positive/iceberg_inplace_migration_with_timestamp_column.q.out new file mode 100644 index 000000000000..609ccc949d78 --- /dev/null +++ b/iceberg/iceberg-handler/src/test/results/positive/iceberg_inplace_migration_with_timestamp_column.q.out @@ -0,0 +1,45 @@ +PREHOOK: query: CREATE EXTERNAL TABLE hive_28518_test(`id` int,`name` string,`dt` timestamp) STORED AS PARQUET +PREHOOK: type: CREATETABLE +PREHOOK: Output: database:default +PREHOOK: Output: default@hive_28518_test +POSTHOOK: query: CREATE EXTERNAL TABLE hive_28518_test(`id` int,`name` string,`dt` timestamp) STORED AS PARQUET +POSTHOOK: type: CREATETABLE +POSTHOOK: Output: database:default +POSTHOOK: Output: default@hive_28518_test +PREHOOK: query: insert into hive_28518_test values (1, "test name" , cast('2024-08-09 14:08:26.326107' as timestamp)) +PREHOOK: type: QUERY +PREHOOK: Input: _dummy_database@_dummy_table +PREHOOK: Output: default@hive_28518_test +POSTHOOK: query: insert into hive_28518_test values (1, "test name" , cast('2024-08-09 14:08:26.326107' as timestamp)) +POSTHOOK: type: QUERY +POSTHOOK: Input: _dummy_database@_dummy_table +POSTHOOK: Output: default@hive_28518_test +POSTHOOK: Lineage: hive_28518_test.dt SCRIPT [] +POSTHOOK: Lineage: hive_28518_test.id SCRIPT [] +POSTHOOK: Lineage: hive_28518_test.name SCRIPT [] +PREHOOK: query: ALTER TABLE hive_28518_test SET TBLPROPERTIES ('storage_handler'='org.apache.iceberg.mr.hive.HiveIcebergStorageHandler', 'format-version' = '2') +PREHOOK: type: ALTERTABLE_PROPERTIES +PREHOOK: Input: default@hive_28518_test +PREHOOK: Output: default@hive_28518_test +POSTHOOK: query: ALTER TABLE hive_28518_test SET TBLPROPERTIES ('storage_handler'='org.apache.iceberg.mr.hive.HiveIcebergStorageHandler', 'format-version' = '2') +POSTHOOK: type: ALTERTABLE_PROPERTIES +POSTHOOK: Input: default@hive_28518_test +POSTHOOK: Output: default@hive_28518_test +PREHOOK: query: select * from hive_28518_test +PREHOOK: type: QUERY +PREHOOK: Input: default@hive_28518_test +PREHOOK: Output: hdfs://### HDFS PATH ### +POSTHOOK: query: select * from hive_28518_test +POSTHOOK: type: QUERY +POSTHOOK: Input: default@hive_28518_test +POSTHOOK: Output: hdfs://### HDFS PATH ### +1 test name 2024-08-09 14:08:26.326107 +PREHOOK: query: select * from hive_28518_test +PREHOOK: type: QUERY +PREHOOK: Input: default@hive_28518_test +PREHOOK: Output: hdfs://### HDFS PATH ### +POSTHOOK: query: select * from hive_28518_test +POSTHOOK: type: QUERY +POSTHOOK: Input: default@hive_28518_test +POSTHOOK: Output: hdfs://### HDFS PATH ### +1 test name 2024-08-09 14:08:26.326107