在一个pyspark数据框中从两种不同的时间戳格式获取日期

问题描述

我有一个带时间戳字段的pyspark数据框。但它包含两种类型的时间戳记格式(均为字符串)。

   +----------------------+
    | timestamp           |
    +---------------------+
    | 06-06-2019,17:15:46|
    +---------------------+
    |2020-01-01T06:07:22.000Z

如何在同一pyspark数据框中创建另一个“日期”列,该列仅基于时间戳字段捕获​​日期? 理想的结果看起来像这样

+----------+---------------------+
|      date|timestamp            |
+----------+----------------------+
|2019-06-06| 06-06-2019,17:15:46 |
+----------+----------------------+
|2020-01-01|2020-01-01T06:07:22.000Z|

解决方法

我认为我们需要为这种情况定义一个函数,并在 dataframe 中使用该函数。

Example:

from pyspark.sql.functions import coalesce,col,to_date

def dynamic_date(col,frmts=("MM-dd-yyyy","yyyy-MM-dd")):
    return coalesce(*[to_date(col,i) for i in frmts])

df.show(10,False)
#+------------------------+
#|timestamp               |
#+------------------------+
#|06-06-2019,17:15:46     |
#|2020-01-01T06:07:22.000Z|
#+------------------------+

df.withColumn("dd",dynamic_date(col("timestamp"))).show(10,False)
#+------------------------+----------+
#|timestamp               |dd        |
#+------------------------+----------+
#|06-06-2019,17:15:46     |2019-06-06|
#|2020-01-01T06:07:22.000Z|2020-01-01|
#+------------------------+----------+