spark函数:date_format不起作用

时间:2019-09-24 14:11:44

标签: apache-spark apache-spark-sql

我正在尝试使用org.apache.spark.sql.functions的date_format格式化给定的字符串Date,但它不起作用:
这是我执行的代码:

val data = Seq("20190413","20190310","20190923").toDF
data.show 
    +--------+
    |   value|
    +--------+
    |20190413|
    |20190310|
    |20190923|
    +--------+
val data2=data.withColumn("date",date_format(col("value"),"yyyyMMdd"))
data2.show
    +--------+----+
    |   value|date|
    +--------+----+
    |20190413|null|
    |20190310|null|
    |20190923|null|
    +--------+----+
doc

可以说:

  

date_format(dateExpr:列,格式:字符串):列
  将日期/时间戳/ 字符串转换为第二个参数给出的日期格式指定的格式的字符串值。

     

有关有效的日期和时间格式模式,请参见java.text.SimpleDateFormat。

我的代码怎么了?

2 个答案:

答案 0 :(得分:1)

如果您使用字符串,则它们应为ISO格式的日期。您指定的格式将应用于输出。

scala> val data=Seq("2019-04-13","2019-03-10","2019-09-23").toDF
scala> val data2=data3.
     |           withColumn("date",date_format(col("value"),"yyyyMMdd")).
     |           withColumn("date-US",date_format(col("value"),"MM/dd/yyyy"))
scala> data2.show()
+----------+--------+----------+
|     value|    date|   date-US|
+----------+--------+----------+
|2019-04-13|20190413|04/13/2019|
|2019-03-10|20190310|03/10/2019|
|2019-09-23|20190923|09/23/2019|
+----------+--------+----------+

编辑

如果日期的字符串表示形式为其他格式,则可能需要将其转换为正确的日期类型,然后根据需要设置格式。例如:

scala> val data2=data.withColumn("date-US",date_format(to_date(col("value"),"yyyyMMdd"),"MM/dd/yyyy"))
scala> data2.show()
+--------+----------+
|   value|   date-US|
+--------+----------+
|20190413|04/13/2019|
|20190310|03/10/2019|
|20190923|09/23/2019|
+--------+----------+
to_date()函数中使用的

格式是输入格式。

答案 1 :(得分:0)

  

在Spark中,您可以使用unix_timestamp和from_unixtime

scala> data.withColumn("tt",from_unixtime(unix_timestamp(col("value"),"yyyyMMdd"),"yyyy/MM/dd")).show

+--------+----------+
|   value|        tt|
+--------+----------+
|20190413|2019/04/13|
|20190310|2019/03/10|
|20190923|2019/09/23|
+--------+----------+

这是获得所需输出的正确方法。I