【问题标题】:Timestamp Timezone Wrong/Missing in Spark/Databricks SQL OutputSpark/Databricks SQL 输出中的时间戳时区错误/缺失
【发布时间】: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 而不是Zz,但这只是给我GMT 而不是UTC;输出基本相同。

我能找到的所有databricks documentationstackoverflow questions 似乎都将打印时区视为设置spark 服务器时间并以这种方式输出,或者进行转换without keeping the resulting timezone。我正在尝试转换为多个 不同 时区,并将时区保留在输出中。我需要以这种格式生成最终结果:

有没有办法做到这一点?如何在转换后保留时区或根据我拥有的时区列将其添加回我需要的格式?鉴于转换有效,并且我可以输出带有 +0000 的最终结果,执行此操作的所有功能似乎都在那里,我该如何将它们组合在一起?

【问题讨论】:

    标签: apache-spark apache-spark-sql databricks databricks-sql


    【解决方案1】:

    Spark 不支持 ANSI SQL 定义的 TIMESTAMP WITH TIMEZONE 数据类型。尽管有一些函数可以跨时区转换时间戳,但这些信息永远不会被存储。 timestamps 上的 Databricks 文档说明:

    Spark SQL 将时间戳类型定义为 TIMESTAMP WITH SESSION TIME ZONE,它是字段的组合(年、月、日、小时、 MINUTE, SECOND, SESSION TZ) 其中 YEAR 到 SECOND 字段 标识 UTC 时区中的一个时刻,其中 SESSION TZ 是 取自 SQL 配置 spark.sql.session.timeZone。

    在您的情况下,spark.sql.session.timeZone 是 UTC,而日期时间模式中的 Z 符号将始终返回 UTC。因此,如果您在单个查询中处理多个时区,您将永远无法使用 date_format 获得正确的行为。

    您唯一能做的就是在列中显式存储时区信息并手动附加以进行显示。

    concat(
       date_format(from_utc_timestamp(createTimestampUTC, v.timezone), "yyyy-MM-dd'T'HH:mm:s "),
       v.timezone
    ) createTimestampLocal
    

    这将显示2022-03-01T16:47:22.000 America/New_York。如果您需要一个偏移量 (-05:00),您需要编写一个 UDF 来进行转换并使用 Python 或 Scala 原生库来处理日期时间转换。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-08-31
      • 1970-01-01
      • 1970-01-01
      • 2019-03-08
      • 2016-01-25
      • 1970-01-01
      • 1970-01-01
      • 2014-01-24
      相关资源
      最近更新 更多