在Spark的WebUI(端口8080)和环境选项卡上有以下设置:
user.timezone Zulu
您知道我可以将其覆盖到UTC的方式/位置吗?
环境细节:
答案 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错误报告(link,link中所述),最新的SPARK版本(在撰写本文时为3.0.0和2.4.6)不完全/正确地支持设置尽管@Moemars和@Daniel给出了答案,但所有操作的时区。
我建议尽可能避免在SPARK中进行时间操作,并从SPARK提取后自己执行操作,或者使用this question中使用的UDF进行操作。
答案 3 :(得分:0)
更改您的系统时区并检查它我希望它能正常工作