使用Spark Dataframe API格式化时间戳记值

时间:2018-12-27 11:45:52

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

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

输入数据框

+----+----+-------------+
|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();

1 个答案:

答案 0 :(得分: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。