Databricks Notebook中SET TIME ZONE在INSERT语句中失效问题求助
Databricks日志框架时区问题解决办法
问题原因
在同一单元格中先执行SET TIME ZONE再运行INSERT语句时,会话时区设置可能未及时生效到后续DML操作中,导致CURRENT_TIMESTAMP()/GETDATE()仍使用旧时区生成时间。
可行解决方案
拆分单元格执行
先单独运行时区设置语句:SET TIME ZONE 'Europe/London';再在新单元格中执行INSERT语句,此时会话时区已生效,
CURRENT_TIMESTAMP()会返回伦敦时区的时间。直接使用CONVERT_TIMEZONE函数
无需依赖会话时区,直接在INSERT中转换时间。CURRENT_TIMESTAMP()默认返回UTC时间,转成伦敦时区的写法:INSERT INTO your_log_table (EventDateTime, ...) VALUES (CONVERT_TIMEZONE('UTC', 'Europe/London', CURRENT_TIMESTAMP()), ...);参数说明:第一个是源时区(这里填UTC,因为Databricks默认
CURRENT_TIMESTAMP()输出UTC时间),第二个是目标时区(Europe/London),第三个是需要转换的时间值。配置集群级默认时区
如果整个日志框架都需要使用伦敦时区,直接在集群的Spark配置中添加:spark.sql.session.timeZone Europe/London这样所有新建会话都会默认使用该时区,无需每次手动执行
SET TIME ZONE。
内容的提问来源于stack exchange,提问作者user1948635
相关产品推荐
相关产品推荐

