从spark 2.0到3.0的字符串到日期的迁移导致无法识别datetimeformatter中的“eee-mmm-dd hh:mm:ss-zzz-yyyy”模式

nfs0ujit  于 2021-05-29  发布在  Spark
关注(0)|答案(32)|浏览(467)

我有一个格式为“fri may 24 00:00:00 bst 2019”的源代码中的日期字符串,我会将其转换为日期,并将其存储在Dataframe中为“2019-05-24”,使用类似于spark 2.0下适用于我的示例的代码

from pyspark.sql.functions import to_date, unix_timestamp, from_unixtime
df = spark.createDataFrame([("Fri May 24 00:00:00 BST 2019",)], ['date_str'])
df2 = df.select('date_str', to_date(from_unixtime(unix_timestamp('date_str', 'EEE MMM dd HH:mm:ss zzz yyyy'))).alias('date'))
df2.show(1, False)

在我的沙盒环境中,我已经更新到spark3.0,现在上面的代码出现了以下错误,在3.0中有没有新的方法来将字符串转换成日期
:org.apache.spark.sparkupgradeexception:由于spark 3.0的升级,您可能会得到不同的结果:无法识别datetimeformatter中的“eee-mmm-dd-hh:mm:ss-zzz-yyyy”模式。
您可以将spark.sql.legacy.timeparserpolicy设置为legacy,以恢复spark 3.0之前的行为。
您可以使用中的指南形成有效的日期时间模式https://spark.apache.org/docs/latest/sql-ref-datetime-pattern.html

wooyq4lh

wooyq4lh18#

感谢您的回复,非常好的建议,目前我将使用遗留设置。我在spark3.0中有一个解决方法,通过替换eee元素,但是我注意到了一个错误:bst时区转换错误,偏移了10个小时,而在legacy下,它正确地保持了与我当前在bst区域相同的状态。我可以用这个做点什么,但要等到秋天钟变了再确认。

spark.sql("set spark.sql.legacy.timeParserPolicy=LEGACY")
df = spark.createDataFrame([('Fri May 24 00:00:00 BST 2019',)], ['mydate'])
df = df.select('mydate',
                to_timestamp(df.mydate.substr(5, 28), 'MMM dd HH:mm:ss zzz yyyy').alias('datetime'),
                to_timestamp(df.mydate, 'EEE MMM dd HH:mm:ss zzz yyyy').alias('LEGACYdatetime')
               ).show(1, False)

df = spark.createDataFrame([('Fri May 24 00:00:00 GMT 2019',)], ['mydate'])
df = df.select('mydate', 
                to_timestamp(df.mydate.substr(5, 28), 'MMM dd HH:mm:ss zzz yyyy').alias('datetime'),
                to_timestamp(df.mydate, 'EEE MMM dd HH:mm:ss zzz yyyy').alias('LEGACYdatetime')
               ).show(1, False)

spark.sql("set spark.sql.legacy.timeParserPolicy=CORRECTED")
df = spark.createDataFrame([('Fri May 24 00:00:00 BST 2019',)], ['mydate'])
df = df.select('mydate', 
                to_timestamp(df.mydate.substr(5, 28), 'MMM dd HH:mm:ss zzz yyyy').alias('datetime')          
               ).show(1, False)

df = spark.createDataFrame([('Fri May 24 00:00:00 GMT 2019',)], ['mydate'])
df = df.select('mydate', 
                to_timestamp(df.mydate.substr(5, 28), 'MMM dd HH:mm:ss zzz yyyy').alias('datetime')           
               ).show(1, False)
mi7gmzs6

mi7gmzs621#

如果要在更新版本的spark(>3)中使用旧格式,则需要设置 spark.conf.set("spark.sql.legacy.timeParserPolicy","LEGACY") 或者 spark.sql("set spark.sql.legacy.timeParserPolicy=LEGACY") ,这将解决问题。

9lowa7mx

9lowa7mx23#

---------+
|英国夏令时2019年5月24日星期五00:00:00 | 2019-05-23 14:00:00|
+

yv5phkfx

yv5phkfx24#

---------+
|mydate |日期时间| legacydatetime|
+

wecizke3

wecizke327#

---------+
|英国夏令时2019年5月24日星期五00:00:00 | 2019-05-24 00:00:00 | 2019-05-24 00:00:00|
+

相关问题