too*_*op4 0 java hadoop jvm bigdata apache-spark
在Spark的WebUI(端口8080)中和环境选项卡上,存在以下设置:
user.timezone祖鲁语
您知道如何/在哪里可以将其覆盖到UTC吗?
信封详细信息:
编辑(有人回答以下内容然后删除):https : //www.timeanddate.com/time/zones/z
现在您可以使用:
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”)
在某些情况下,您还需要设置 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
正如这些 SPARK 错误报告(链接、链接)中所述,最新的 SPARK 版本(撰写本文时为 3.0.0 和 2.4.6)并不完全/正确支持为所有操作设置时区,尽管@Moemars 给出了答案和@丹尼尔。
我建议尽可能避免在 SPARK 中进行时间操作,或者在从 SPARK 中提取后自行执行这些操作,或者使用 UDF(如本问题中所使用的) 。
| 归档时间: |
|
| 查看次数: |
2491 次 |
| 最近记录: |