【问题标题】:with pyspark.sql.functions unix_timestamp get null使用 pyspark.sql.functions unix_timestamp 获取 null
【发布时间】:2017-08-15 16:58:01
【问题描述】:

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

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))

但我得到空值

+-----------------------------+------+
|dt                           |parsed|
+-----------------------------+------+
|2017-01-23T08:12:39.929+01:00|null  |
+-----------------------------+------+

为什么?

【问题讨论】:

    标签: python apache-spark pyspark unix-timestamp


    【解决方案1】:

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

    yyyy-MM-dd'T'kk:mm:ss
    

    为了匹配完整的模式,您需要S 表示毫秒,X 表示时区:

    yyyy-MM-dd'T'kk:mm:ss.SSSXXX
    

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

    from pyspark.sql.functions import col
    
    col("dt").cast("timestamp")
    

    应该可以正常工作:

    spark.sql(
        """SELECT CAST("2011-01-23T08:12:39.929+01:00" AS timestamp)"""
    ).show(1, False)
    
    +------------------------------------------------+
    |CAST(2011-01-23T08:12:39.929+01:00 AS TIMESTAMP)|
    +------------------------------------------------+
    |2011-01-23 08:12:39.929                         |
    +------------------------------------------------+
    

    参考:SimpleDateFormat

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-11-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多