【问题标题】:Format timestamp value using Spark Dataframe API [duplicate]使用 Spark Dataframe API 格式化时间戳值 [重复]
【发布时间】:2018-12-27 11:45:52
【问题描述】:

我有一个带有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();

【问题讨论】:

标签: date apache-spark apache-spark-sql timestamp


【解决方案1】:

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。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-31
    • 1970-01-01
    • 2018-03-18
    • 1970-01-01
    • 2019-02-17
    相关资源
    最近更新 更多