在pyspark中将各种日期格式转换为通用日期格式

时间:2019-11-20 09:46:42

标签: pyspark timestamp pyspark-sql

Spark SQL - 2.3 and 2.2. PySpark.

一个日期为2019-11-19,另一个日期为2019-11-19T17:19:39.214841000000

需要将两者都转换为yyyy-MM-ddThh:mm:ss.SSSSSSSS 需要在spark.sql(select ......)

中使用

到目前为止,已经尝试了大约20种选择,但全部都为空。

尝试:

from_utc_timestamp(A.SE_TS, 'UTC')
    from_unixtime(A.SE_TS, 'yyyy-MM-dd HH:mm:ss')
    from_unixtime(A.SE_TS)
to_date(A.SE_TS, 'yyyy-MM-dd HH:mm:ss')
    to_date(A.SE_TS, 'yyyy-MM-dd hh:mm:ss.SSSS') (In many combinations of upper and lowercase)
    from_unixtime(unix_timestamp(), "y-MM-dd'T'hh:mm:ssZ") - Gives syntax issues on ""

所有人都为空。

编辑: 数据:

+--------------------------------+-------------+
|A.SE_TS                         |B.SE_TS      |
+--------------------------------+-------------+
|2019-11-19T17:19:39.214841000000|2019-11-19   |
+--------------------------------+-------------+

1 个答案:

答案 0 :(得分:1)

所以这里是

Java's Simple Date Format supports only second precision

但是,您仍然可以通过以下方式将字符串解析为时间戳:

df.withColumn("date", F.to_timestamp(F.lit("2019-11-19T17:19:39.214841000000"), "yyyy-MM-dd'T'HH:mm:ss")).select("date").show(5)
+-------------------+
|               date|
+-------------------+
|2019-11-19 17:19:39|
|2019-11-19 17:19:39|
|2019-11-19 17:19:39|
|2019-11-19 17:19:39|
|2019-11-19 17:19:39|
+-------------------+

您可以编写一个自定义函数,如上面链接中所述,该函数使您可以使用时间戳中的微秒进行排序。

请参考:pault's answer on Convert date string to timestamp in pySpark

编辑: 我也尝试过spark.sql(query)

df = df.withColumn("date_string", F.lit("2019-11-19T17:19:39.214841000000"))
df.registerTempTable("df")

query = """SELECT to_timestamp(date_string, "yyyy-MM-dd'T'HH:mm:ss") as time from df limit 3"""

spark.sql(query).show()
+-------------------+
|               time|
+-------------------+
|2019-11-19 17:19:39|
|2019-11-19 17:19:39|
|2019-11-19 17:19:39|
+-------------------+