Apache Spark - 如何将时区设置为UTC?目前默认为祖鲁人

时间:2018-04-04 06:29:39

标签: java apache-spark hadoop jvm bigdata

在Spark的WebUI(端口8080)和环境选项卡上有以下设置:

user.timezone Zulu

您知道我可以将其覆盖到UTC的方式/位置吗?

环境细节:

  • Spark 2.1.1
  • JRE-1.8.0-openjdk.x86_64
  • 没有jdk
  • EC2 Amazon Linux
编辑(有人回答下面然后删除): https://www.timeanddate.com/time/zones/z

4 个答案:

答案 0 :(得分:3)

现在您可以使用:

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

https://issues.apache.org/jira/browse/SPARK-18936在2.2.0起

编辑:

另外,我将默认的时区设置为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.*")

如果我的默认时区为Europe / Dublin,即GMT + 1,并且Spark sql会话时区设置为UTC,Spark将假定“ 2018-09-14 16:05:37”位于Europe / Dublin TimeZone中,并执行转换(结果将为“ 2018-09-14 15:05:37”)

答案 1 :(得分:3)

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

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

答案 2 :(得分:2)

如这些SPARK错误报告(linklink中所述),最新的SPARK版本(在撰写本文时为3.0.0和2.4.6)不完全/正确地支持设置尽管@Moemars和@Daniel给出了答案,但所有操作的时区。

我建议尽可能避免在SPARK中进行时间操作,并从SPARK提取后自己执行操作,或者使用this question中使用的UDF进行操作。

答案 3 :(得分:0)

更改您的系统时区并检查它我希望它能正常工作