【问题标题】:change date format in glue更改胶水的日期格式
【发布时间】:2021-05-03 22:32:36
【问题描述】:

我有一个看起来像这样的数据集。我想将日期列中的所有值更改为正确的日期时间格式。 dd-mm-2020 (如果可能,最好还根据日期按升序排列所有行)。如何在 spark 中实现这一点?

Name   |Type        |   date      |Value    |
ALZA CZ|New         | 01/01(FRI)  |     0
CLPA CZ|New         | 01/01(FRI)  |     1
ALZA CZ|Old         | 01/02(SAT)  |     1
CLPA CZ|Old         | 01/02(SAT)  |     5

数据源已经转换成数据框:

dataframe = datasource0.toDF()

【问题讨论】:

    标签: python apache-spark pyspark aws-glue


    【解决方案1】:

    首先,您可以使用regexp_replace(Python 文档here)来更改Date 列的字符串,该字符串接受3 个参数:要操作的列、您要操作的正则表达式匹配,以及你想用什么替换匹配的文本。

    对于日期升序排序,需要将Date列转换为DateType。为此,您可以使用to_date 方法(Python 文档here)。但是,这将不可避免地将您的日期格式更改为YYYY-MM-DD(“这是因为,正如您所猜测的那样,按照升序,我们首先查看按年排序,然后按月排序,最后按天排序,以便 2019 年到来 2020 年之前,然后是 1 月 2 月之前,一个月的 1 号是 2 号之前)。要处理这个问题,我们只需使用 @987654330 @ 方法(Python 文档here在按日期对行进行排序后指定我们想要输出的所需日期格式。

    为了测试这一点,我在您的 dataframe 中添加了一些行:

    +-------+----+----------+-----+
    |   Name|Type|      Date|Value|
    +-------+----+----------+-----+
    |ALZA CZ| New|01/01(FRI)|    0|
    |CLPA CZ| New|01/01(FRI)|    1|
    |YYYY YY| Old|01/29(FRI)|    1|
    |ALZA CZ| Old|01/02(SAT)|    1|
    |XXXX XX| New|03/12(SAT)|    5|
    |CLPA CZ| Old|01/02(SAT)|    5|
    +-------+----+----------+-----+
    

    然后我们使用上面的方法将Date转换为我们需要的。在这里,我分两步进行正则表达式匹配,一是将月份和日期之间的/ 替换为-,另一步是将带括号的文本替换为-2020。接下来,我只是将Date 转换为DateType 列(通过指定当前的MM-dd-yyyy 日期格式)并相应地对DataFrame 行进行排序,然后最后一次将Date 转换为所需的dd-MM-yyyy 字符串格式。

    // In Python
    dataframe.withColumn("Date", regexp_replace("Date", "/", "-"))
              .withColumn("Date", regexp_replace("Date", "\\([a-z]+\\)", "-2020"))
              .withColumn("Date", to_date("Date", "MM-dd-yyyy"))
              .orderBy("Date")
              .withColumn("Date", date_format("Date", "dd-MM-yyyy"))
    
    
    // In Scala
    dataframe.withColumn("Date", regexp_replace(col("Date"), "/", "-"))
              .withColumn("Date", regexp_replace(col("Date"), "\\([A-Z]+\\)", "-2020"))
              .withColumn("Date", to_date(col("Date"), "MM-dd-yyyy"))
              .orderBy("Date")
              .withColumn("Date", date_format(col("Date"), "dd-MM-yyyy"))
    

    被操纵的dataframe 现在看起来像这样:

    +-------+----+----------+-----+
    |   Name|Type|      Date|Value|
    +-------+----+----------+-----+
    |CLPA CZ| New|01-01-2020|    1|
    |ALZA CZ| New|01-01-2020|    0|
    |ALZA CZ| Old|02-01-2020|    1|
    |CLPA CZ| Old|02-01-2020|    5|
    |YYYY YY| Old|29-01-2020|    1|
    |XXXX XX| New|12-03-2020|    5|
    +-------+----+----------+-----+
    

    【讨论】:

    • 由于某种原因,它给了我最终数据帧中的所有“空”值
    • 尝试不使用最后一个 withColumn 方法。将DateType 转换为String 可能只是PySpark 的事情
    • [A-Z] 更改为[a-z]似乎可以解决问题
    猜你喜欢
    • 1970-01-01
    • 2011-06-05
    • 2016-11-22
    相关资源
    最近更新 更多