首页 > 解决方案 > 使用 Spark Dataframe API 格式化时间戳值

问题描述

我有一个数据框,其中有一date 列以String格式表示 Unix 时间戳。列值需要格式化为不同的字符串表示形式,如下所示 -

输入数据框

+----+----+-------------+
|name|code|         date|
+----+----+-------------+
|   A|   1|1545905416000|
|   B|   3|1545905416000|
|   C|   5|1545905416000|
+----+----+-------------+

预期输出数据框

+----+----+-------------+
|name|code|         date|
+----+----+-------------+
|   A|   1|   2018-12-27|
|   B|   3|   2018-12-27|
|   C|   5|   2018-12-27|
+----+----+-------------+

这不起作用,因为它提供null了所有值 -

 peopleDFCsv.withColumn("formatted_date", 
            functions.date_format(functions.col("date"), "yyyy-MM-dd"))
            .show();

标签: dateapache-sparkapache-spark-sqltimestamp

解决方案


date_format函数使用时间戳而不是自纪元以来的毫秒数。尝试使用 CAST 进行转换:

df.withColumn("formatted_date",
  functions.date_format(expr("CAST(date/1000 AS TIMESTAMP)"), "yyyy-MM-dd"))
  .show()

//    Outputs:
//    +----+----+-------------+--------------+
//    |name|code|         date|formatted_date|
//    +----+----+-------------+--------------+
//    |   A|   1|1545905416000|    2018-12-27|
//    |   B|   3|1545905416000|    2018-12-27|
//    |   C|   5|1545905416000|    2018-12-27|
//    +----+----+-------------+--------------+

您获得的原因null是因为 date_format 将您的字符串解释为时间戳,例如"2018-12-27 11:10:16". 纯数字不符合它期望的格式,所以它只返回 null。


推荐阅读