Pyspark 解析自定义日期格式
Posted
技术标签:
【中文标题】Pyspark 解析自定义日期格式【英文标题】:Pyspark parse custom date format 【发布时间】:2019-03-19 08:23:30 【问题描述】:我面临这个挑战:我有一个复杂的日期格式,它是一个字符串。所以我使用unix_timestamp函数来解析它。
但是我找不到合适的模式来使用。我不知道时区、星期几和月份的正确缩写,也没有找到一个链接来澄清它们。
from pyspark.sql.functions import unix_timestamp
d = spark.createDataFrame([(1,"Mon Jan 14 11:43:20 EET 2019"),\
(2,"Wed Jun 27 16:26:46 EEST 2018")],\
["id","time_str"])
pattern = "aaa bbb dd HH:mm:ss ZZZ yyyy"
d= d.withColumn("timestampCol", unix_timestamp(d["time_str"], pattern).cast("timestamp"))
d.show()
>>>
+---+------------------------------+------------+
|id |time_str |timestampCol|
+---+------------------------------+------------+
|1 |Mon Jan 14 11:43:20 EET 2019 |null |
|2 |Wed Jun 27 16:26:46 EEST 2018 |null |
+---+------------------------------+------------+
有人知道如何将此字符串正确转换为时间戳吗?
【问题讨论】:
【参考方案1】:你可以试试下面的代码:
from pyspark.sql.functions import *
d = spark.createDataFrame([(1,"Mon Jan 14 11:43:20 EET 2019"),\
(2,"Wed Jun 27 16:26:46 EEST 2018")],\
["id","time_str"])
pattern = "EEE MMM dd HH:mm:ss z yyyy"
d.withColumn("timestamp", unix_timestamp(col("time_str"), pattern).cast("timestamp")).show(truncate=False)
它产生下面的输出。有关更多文档,您可以参考https://docs.oracle.com/javase/8/docs/api/java/text/SimpleDateFormat.html,我曾经用它来查找EEE
和MMM
,因为您每个工作日和每月分别有 3 个字符。
+---+-----------------------------+-------------------+
|id |time_str |timestamp |
+---+-----------------------------+-------------------+
|1 |Mon Jan 14 11:43:20 EET 2019 |2019-01-14 09:43:20|
|2 |Wed Jun 27 16:26:46 EEST 2018|2018-06-27 13:26:46|
+---+-----------------------------+-------------------+
【讨论】:
IllegalArgumentException: Illegal pattern character: E
。似乎不再支持:Symbols of ‘E’, ‘F’, ‘q’ and ‘Q’ can only be used for datetime formatting, e.g. date_format. They are not allowed used for datetime parsing, e.g. to_timestamp.
spark.apache.org/docs/latest/sql-ref-datetime-pattern.html
用 'E' 解析日期的替代方法是什么?以上是关于Pyspark 解析自定义日期格式的主要内容,如果未能解决你的问题,请参考以下文章