使用 Spark Dataframe API 格式化时间戳值 [重复]

Posted

技术标签:

【中文标题】使用 Spark Dataframe API 格式化时间戳值 [重复]【英文标题】:Format timestamp value using Spark Dataframe API [duplicate] 【发布时间】: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();

【问题讨论】:

或Scala: Spark SQL to_date(unix_timestamp) returning NULL 【参考方案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。

【讨论】:

以上是关于使用 Spark Dataframe API 格式化时间戳值 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

使用 Pyspark 从 REST API 获取数据到 Spark Dataframe

Spark Sql 与 Spark Dataframe API

Spark-Scala:使用异常处理将固定宽度线解析为 Dataframe Api

Spark DataFrame - 使用 Java API 选择列列表

Spark基本统计--基于DataFrame的API|附视频

spark dataFrame api操作