{"header":{"type":"auto_translation","ret_code":"NullPointerException","time_cost":1954.0,"request_id":"e4dba49859b511ed9ba95b34174e380d"}}
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”)
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
unftdfkk3#
正如这些SPARK错误报告(link,link)中所描述的,尽管@Moemars和@丹尼尔给出了答案,但最新的SPARK版本(撰写本文时为3.0.0和2.4.6)并不完全/正确地支持为所有操作设置时区。我建议在SPARK中尽可能避免时间操作,或者在从SPARK中提取后自己执行,或者使用UDF执行,就像this question中使用的那样。
ycggw6v24#
您可以使用下面的将时区设置为您想要的任何时区,您的笔记本或会话将为current_time()或current_timestamp()保留该值。%sql设置时区'美洲/洛杉矶' -〉以获取PST设置时区'美洲/芝加哥';- 〉获得CST最后一部分应该是一个城市,它不允许所有的城市,因为我尝试。参考文件:https://spark.apache.org/docs/latest/sql-ref-syntax-aux-conf-mgmt-set-timezone.html
zed5wv105#
更改您的系统时区,并检查它,我希望它会工作
5条答案
按热度按时间7tofc5zh1#
现在您可以用途:
自2.2.0中的https://issues.apache.org/jira/browse/SPARK-18936起
此外,我还将默认的时区设置为UTC,以避免隐式转换
否则,当您要转换的时间戳中不存在时区信息时,您将获得从默认时区到UTC的隐式转换
示例:
如果我的默认时区是欧洲/都柏林,即GMT+1,Spark sql会话时区设置为UTC,Spark将假定“2018-09-14 16:05:37”位于欧洲/都柏林时区,并进行转换(结果将为“2018-09-14 15:05:37”)
xqkwcwgp2#
在某些情况下,您还需要设置JVM时区。例如,将数据加载到TimestampType列时,它将以本地JVM时区解释字符串。要设置JVM时区,您需要为驱动程序和执行器添加额外的JVM选项:
我们在本地单元测试环境中执行此操作,因为我们的本地时间不是GMT。
有用的参考:https://en.wikipedia.org/wiki/List_of_tz_database_time_zones
unftdfkk3#
正如这些SPARK错误报告(link,link)中所描述的,尽管@Moemars和@丹尼尔给出了答案,但最新的SPARK版本(撰写本文时为3.0.0和2.4.6)并不完全/正确地支持为所有操作设置时区。
我建议在SPARK中尽可能避免时间操作,或者在从SPARK中提取后自己执行,或者使用UDF执行,就像this question中使用的那样。
ycggw6v24#
您可以使用下面的将时区设置为您想要的任何时区,您的笔记本或会话将为current_time()或current_timestamp()保留该值。
%sql
设置时区'美洲/洛杉矶' -〉以获取PST
设置时区'美洲/芝加哥';- 〉获得CST
最后一部分应该是一个城市,它不允许所有的城市,因为我尝试。
参考文件:https://spark.apache.org/docs/latest/sql-ref-syntax-aux-conf-mgmt-set-timezone.html
zed5wv105#
更改您的系统时区,并检查它,我希望它会工作