我有一个格式为“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
32条答案
按热度按时间fbcarpbf16#
--------+
zyfwsgd617#
---------+
wooyq4lh18#
感谢您的回复,非常好的建议,目前我将使用遗留设置。我在spark3.0中有一个解决方法,通过替换eee元素,但是我注意到了一个错误:bst时区转换错误,偏移了10个小时,而在legacy下,它正确地保持了与我当前在bst区域相同的状态。我可以用这个做点什么,但要等到秋天钟变了再确认。
ttygqcqt19#
---------+
bqf10yzr20#
---------+
+
mi7gmzs621#
如果要在更新版本的spark(>3)中使用旧格式,则需要设置
spark.conf.set("spark.sql.legacy.timeParserPolicy","LEGACY")
或者spark.sql("set spark.sql.legacy.timeParserPolicy=LEGACY")
,这将解决问题。ha5z0ras22#
---------+
9lowa7mx23#
---------+
|英国夏令时2019年5月24日星期五00:00:00 | 2019-05-23 14:00:00|
+
yv5phkfx24#
---------+
|mydate |日期时间| legacydatetime|
+
olhwl3o225#
---------+
+
bfrts1fy26#
---------+
wecizke327#
---------+
|英国夏令时2019年5月24日星期五00:00:00 | 2019-05-24 00:00:00 | 2019-05-24 00:00:00|
+
ma8fv8wu28#
--------+
mitkmikd29#
--------+
vfwfrxfs30#
--------+