This is an automated email from the ASF dual-hosted git repository.
ayushsaxena pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/hive.git
The following commit(s) were added to refs/heads/master by this push:
new eaa8189600c HIVE-28518: Iceberg: Fix ClassCastException during
in-place migration to Iceberg tables with timestamp columns (#5590). (Gopinath,
reviewed by Ayush Saxena, Shohei Okumiya)
eaa8189600c is described below
commit eaa8189600c74efa35cc9975eea0f81df59e5088
Author: gopigowtham <[email protected]>
AuthorDate: Mon Jan 27 21:54:39 2025 +0530
HIVE-28518: Iceberg: Fix ClassCastException during in-place migration to
Iceberg tables with timestamp columns (#5590). (Gopinath, reviewed by Ayush
Saxena, Shohei Okumiya)
---
.../IcebergTimestampObjectInspectorHive3.java | 12 +++++-
...eberg_inplace_migration_with_timestamp_column.q | 7 ++++
...g_inplace_migration_with_timestamp_column.q.out | 45 ++++++++++++++++++++++
3 files changed, 63 insertions(+), 1 deletion(-)
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 86ecc929a5f..f2e5c12dab8 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 00000000000..c5a5af3d095
--- /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 00000000000..609ccc949d7
--- /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