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

too*_*op4 0 java hadoop jvm bigdata apache-spark

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

user.timezone祖鲁语

您知道如何/在哪里可以将其覆盖到UTC吗?

信封详细信息:

  • 火花2.1.1
  • jre-1.8.0-openjdk.x86_64
  • 没有jdk
  • EC2 Amazon Linux

编辑(有人回答以下内容然后删除):https : //www.timeanddate.com/time/zones/z

Dan*_*iel 8

现在您可以使用:

spark.conf.set("spark.sql.session.timeZone", "UTC")
Run Code Online (Sandbox Code Playgroud)

自2.2.0版以来https://issues.apache.org/jira/browse/SPARK-18936

编辑:

另外,我将默认的TimeZone设置为UTC以避免隐式转换

TimeZone.setDefault(TimeZone.getTimeZone("UTC"))
Run Code Online (Sandbox Code Playgroud)

否则,当您要转换的时间戳中没有时区信息时,您将获得从默认时区到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.*")
Run Code Online (Sandbox Code Playgroud)

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


Moe*_*ars 8

在某些情况下,您还需要设置 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()
Run Code Online (Sandbox Code Playgroud)

我们在本地单元测试环境中执行此操作,因为我们的本地时间不是 GMT。

有用的参考:https : //en.wikipedia.org/wiki/List_of_tz_database_time_zones

  • 喜欢这个答案有两个原因。#1) 它在会话生成器而不是会话上设置配置。由于执行的顺序,这对时区没有影响(所有 Spark 代码在创建会话之后运行,通常在设置配置之前运行)。#2) 这是唯一正确建议 JVM 中用户时区设置的答案以及这样做的原因!希望OP能接受这个答案:( (5认同)

Die*_*rDP 6

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

我建议尽可能避免在 SPARK 中进行时间操作,或者在从 SPARK 中提取后自行执行这些操作,或者使用 UDF(如本问题中所使用的) 。


Pra*_*tel -25

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

  • 这并不能真正解决问题。无法更改所有使用的系统上的 TZ。 (2认同)