pyspark 如何在Apache Spark中将时区设置为UTC?

nx7onnlm  于 2022-11-01  发布在  Spark
关注(0)|答案(5)|浏览(243)

{"header":{"type":"auto_translation","ret_code":"NullPointerException","time_cost":1954.0,"request_id":"e4dba49859b511ed9ba95b34174e380d"}}

7tofc5zh

7tofc5zh1#

现在您可以用途:

spark.conf.set("spark.sql.session.timeZone", "UTC")

自2.2.0中的https://issues.apache.org/jira/browse/SPARK-18936
此外,我还将默认的时区设置为UTC,以避免隐式转换

TimeZone.setDefault(TimeZone.getTimeZone("UTC"))

否则,当您要转换的时间戳中不存在时区信息时,您将获得从默认时区到UTC的隐式转换
示例:

val rawJson = """ {"some_date_field": "2018-09-14 16:05:37"} """

val dsRaw = sparkJob.spark.createDataset(Seq(rawJson))

val output =
  dsRaw
    .select(
      from_json(
        col("value"),
        new StructType(
          Array(
            StructField("some_date_field", DataTypes.TimestampType)
          )
        )
      ).as("parsed")
    ).select("parsed.*")

如果我的默认时区是欧洲/都柏林,即GMT+1,Spark sql会话时区设置为UTC,Spark将假定“2018-09-14 16:05:37”位于欧洲/都柏林时区,并进行转换(结果将为“2018-09-14 15:05:37”)

xqkwcwgp

xqkwcwgp2#

在某些情况下,您还需要设置JVM时区。例如,将数据加载到TimestampType列时,它将以本地JVM时区解释字符串。要设置JVM时区,您需要为驱动程序和执行器添加额外的JVM选项:

spark = pyspark.sql.SparkSession \
    .Builder()\
    .appName('test') \
    .master('local') \
    .config('spark.driver.extraJavaOptions', '-Duser.timezone=GMT') \
    .config('spark.executor.extraJavaOptions', '-Duser.timezone=GMT') \
    .config('spark.sql.session.timeZone', 'UTC') \
    .getOrCreate()

我们在本地单元测试环境中执行此操作,因为我们的本地时间不是GMT。
有用的参考:https://en.wikipedia.org/wiki/List_of_tz_database_time_zones

unftdfkk

unftdfkk3#

正如这些SPARK错误报告(linklink)中所描述的,尽管@Moemars和@丹尼尔给出了答案,但最新的SPARK版本(撰写本文时为3.0.0和2.4.6)并不完全/正确地支持为所有操作设置时区。
我建议在SPARK中尽可能避免时间操作,或者在从SPARK中提取后自己执行,或者使用UDF执行,就像this question中使用的那样。

ycggw6v2

ycggw6v24#

您可以使用下面的将时区设置为您想要的任何时区,您的笔记本或会话将为current_time()或current_timestamp()保留该值。
%sql
设置时区'美洲/洛杉矶' -〉以获取PST
设置时区'美洲/芝加哥';- 〉获得CST
最后一部分应该是一个城市,它不允许所有的城市,因为我尝试。
参考文件:https://spark.apache.org/docs/latest/sql-ref-syntax-aux-conf-mgmt-set-timezone.html

zed5wv10

zed5wv105#

更改您的系统时区,并检查它,我希望它会工作

相关问题