【发布时间】:2022-07-16 14:53:48
【问题描述】:
在 databricks/spark sql 中的时区之间转换时间戳时,时区本身在最终结果中似乎丢失了,我似乎无法保留或添加回来。
我有一堆 UTC 时间,并且正在使用 from_utc_timetamp() 根据另一个字段将它们转换为不同的时区。结果计算正确,但如果我用时区输出它,它会显示为 UTC。似乎转换正确完成,但最终结果没有存储时区(由this answer 确认),因此它在所有情况下都使用服务器区域作为时区。
示例:使用以下 SQL:
createTimestampUTC,
v.timezone,
date_format(from_utc_timestamp(createTimestampUTC, v.timezone),"yyyy-MM-dd'T'HH:mm:s Z") createTimestampLocal,
我得到以下信息:
您可以看到第三列已正确完成时区转换,但输出本身仍显示为 UTC 时区。
在date_format 函数中使用lowercase z 重复此操作显示相同;即,转换发生,但最终结果仍被视为 UTC。
createTimestampUTC,
v.timezone,
date_format(from_utc_timestamp(createTimestampUTC, v.timezone),"yyyy-MM-dd'T'HH:mm:s z") createTimestampLocal,
我也可以在格式输出中使用O 而不是Z 或z,但这只是给我GMT 而不是UTC;输出基本相同。
我能找到的所有databricks documentation 或stackoverflow questions 似乎都将打印时区视为设置spark 服务器时间并以这种方式输出,或者进行转换without keeping the resulting timezone。我正在尝试转换为多个 不同 时区,并将时区保留在输出中。我需要以这种格式生成最终结果:
有没有办法做到这一点?如何在转换后保留时区或根据我拥有的时区列将其添加回我需要的格式?鉴于转换有效,并且我可以输出带有 +0000 的最终结果,执行此操作的所有功能似乎都在那里,我该如何将它们组合在一起?
【问题讨论】:
标签: apache-spark apache-spark-sql databricks databricks-sql