FAQ-iceberg表存在timestamp字段,使用 Sparksql 写入数据报错
FAQ-iceberg表存在timestamp字段,使用 Sparksql 写入数据报错
适用模块
Iceberg具体报错
Cannot handle timestamp without timezone fields in Spark. Spark does not natively support this type but if you would like to handle all timestamps as timestamp with timezone set 'spark.sql.iceberg.handle-timestamp-without-timezone' to true. This will not change the underlying values stored but will change their displayed values in Spark. For more information please seehttps://docs.databricks.com/aws/en/archive/spark-3.x-migration/dates-timestamps#ansi-sql-and-spark-sql-timestamps
问题背景
用户在测试环境使用 Spark SQL 建表,包含 TIMESTAMP 字段,建表、写入过程均正常;
用户上线,使用中台发布中心将表同步到生产环境,其中中台发布中心使用 Hive 引擎重放 DDL 在生产环境建表,用户使用 Spark SQL 写入数据时,TIMESTAMP 字段报错。
原因分析
Hive 和 Spark 中,对 TIMESTAMP 的定义不同:
Hive 中,TIMESTAMP 是 TIMESTAMP WITHOUT TIME ZONE 的别名;
Spark 中,TIMESTAMP 是 TIMESTAMP WITH SESSION TIME ZONE 的别名;
详见:https://docs.databricks.com/aws/en/archive/spark-3.x-migration/dates-timestamps#ansi-sql-and-spark-sql-timestamps
截止 Hive 2.3 和 Spark 3.3,两个引擎对 TIMESTAMP 的定义不同,且无交集。
Hive 3 引入了 TIMESTAMPLOCALTZ 类型,对应 Spark 的 TIMESTAMP 类型;
Spark 3.4 引入了 TIMESTAMP_NTZ 类型,对应 Hive 的 TIMESTAMP 类型;
问题结论
不建议配置 spark.sql.iceberg.handle-timestamp-without-timezone=true,这虽然能消除错误让任务执行成功,但本质上损坏了数据。
建议暂时不用TIMESTAMP,或者生产有TIMESTAMP的表不用发布中心发,可以走sparksql重新建表
如果对 TIMESTAMP WITHOUT TIME ZONE 有强烈诉求,后续spark支持4.1之后 可以考虑 Spark 4.1
作者:魏璐璐
以上内容对您是否有帮助?