我正在尝试使用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。
我的代码怎么了?
答案 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