与pyspark.sql.functions unix_timestamp获取空

Jua*_*blo 5 python unix-timestamp apache-spark pyspark

我尝试使用此代码将列从字符串转换为时间戳

from pyspark.sql.functions import unix_timestamp
(sc
.parallelize([Row(dt='2017-01-23T08:12:39.929+01:00')])
.toDF()
.withColumn("parsed", unix_timestamp("dt", "yyyy-MM-ddThh:mm:ss")
.cast("double")
.cast("timestamp"))
.show(1, False))
Run Code Online (Sandbox Code Playgroud)

但我得到空

from pyspark.sql.functions import unix_timestamp
(sc
.parallelize([Row(dt='2017-01-23T08:12:39.929+01:00')])
.toDF()
.withColumn("parsed", unix_timestamp("dt", "yyyy-MM-ddThh:mm:ss")
.cast("double")
.cast("timestamp"))
.show(1, False))
Run Code Online (Sandbox Code Playgroud)

为什么呢?

use*_*411 7

您得到的NULL原因是您使用的格式与数据不匹配。要获得最小匹配,您必须T使用单引号进行转义:

yyyy-MM-dd'T'kk:mm:ss
Run Code Online (Sandbox Code Playgroud)

并匹配S毫秒和X时区所需的完整模式:

yyyy-MM-dd'T'kk:mm:ss.SSSXXX
Run Code Online (Sandbox Code Playgroud)

但在当前的Spark版本中直接cast

from pyspark.sql.functions import col

col("dt").cast("timestamp")
Run Code Online (Sandbox Code Playgroud)

应该可以正常工作:

spark.sql(
    """SELECT CAST("2011-01-23T08:12:39.929+01:00" AS timestamp)"""
).show(1, False)
Run Code Online (Sandbox Code Playgroud)
yyyy-MM-dd'T'kk:mm:ss
Run Code Online (Sandbox Code Playgroud)

参考:SimpleDateFormat