【问题标题】:Change data type column from string to date with custom format使用自定义格式将数据类型列从字符串更改为日期
【发布时间】:2019-09-02 15:34:01
【问题描述】:

我有一个 DF,其中包含一个名为“data”的字符串列,格式为 02/09/2019 (dd/MM/yyyy)。我想将列的数据类型从 STRING 更改为 DATE,保持相同的格式。我正在使用 Spark 2.1.0。

我已经尝试过声明:

df.select(to_date( unix_timestamp($"data", "dd/MM/yyyy").cast("timestamp")))

它将列从 STRING 转换为 DATE,但格式为 yyyy-MM-dd:

+----------+
|      data|
+----------+
|2003-07-22|
|2003-08-01|
+----------+

使用 date_format 函数,我获得了正确的格式但错误的数据类型(再次为 STRING):

df.select(date_format(to_date( unix_timestamp($"data", "dd/MM/yyyy").cast("timestamp")), "dd/MM/yyyy") as "data").printSchema()

非常感谢。

【问题讨论】:

    标签: scala date dataframe apache-spark


    【解决方案1】:

    Date 数据类型要求格式为 yyyy-MM-dd

    如果我们的格式为dd/MM/yyyy,我们不能转换为date 数据类型(casting will result null value)

    Example:

    df.show() //sample data
    
    +----------+
    |      data|
    +----------+
    |22/07/2003|
    |01/08/2003|
    +----------+
    

    df.selectExpr("date(data)").show() //casting to date type
    
    +----+
    |data|
    +----+
    |null|
    |null|
    +----+
    

    How to cast to Datetype?

    df.select(to_date(unix_timestamp($"data","dd/MM/yyyy").cast("timestamp")).alias("da")).show()
    

    (或)

    df.select(from_unixtime(unix_timestamp($"data","dd/MM/yyyy"),"yyyy-MM-dd").cast("date").alias("da")).show()
    
    +----------+
    |        da|
    +----------+
    |2003-07-22|
    |2003-08-01|
    +----------+
    

    printSchema:

    df.select(from_unixtime(unix_timestamp($"data","dd/MM/yyyy"),"yyyy-MM-dd").cast("date").alias("dd")).printSchema
    root
     |-- dd: date (nullable = true)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-04
      • 2021-05-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多