【问题标题】:spark function : date_format doesn't work火花功能:date_format 不起作用
【发布时间】:2019-09-24 23:28:05
【问题描述】:

我正在尝试使用: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: Column, format: String): Column
将日期/时间戳/字符串转换为字符串值,格式由第二个参数给出的日期格式指定。

请参阅 java.text.SimpleDateFormat 了解有效的日期和时间格式模式。

我的代码有什么问题?

【问题讨论】:

    标签: apache-spark apache-spark-sql


    【解决方案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() 函数中使用的格式是 input 格式。

    【讨论】:

    • 好的,我明白了,所以如果字符串日期的格式不是 IOS,它将不起作用
    • @aName 并非没有添加一些字符串日期字符串混淆。
    【解决方案2】:

    在 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|
    +--------+----------+
    

    这是实现所需输出的正确方法。我

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-06-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-08-28
      • 2019-03-02
      • 1970-01-01
      相关资源
      最近更新 更多