【问题标题】:If column having dates in multiple format, Get last date of month for specific date format如果列具有多种格式的日期,则获取特定日期格式的月末日期
【发布时间】:2021-09-03 12:59:12
【问题描述】:

我有一个包含两列(SEQ - 整数,MAIN_DATE - 日期)的 spark 数据框:

现在我想根据条件添加一列,如果 MAIN_DATE 的格式为“MMM-YYYY”,则应将其转换为该月的最后一天,新数据框应如下所示:

任何建议将不胜感激。

【问题讨论】:

    标签: scala dataframe apache-spark pyspark apache-spark-sql


    【解决方案1】:

    您可以使用 Spark 的 when/otherwise 方法,以便对 MAIN_DATE 列的每种不同日期格式进行不同的操作。

    更具体地说,您可以简单地根据字段的字符串长度(因为我们知道这些值我们总是有 8 个字符)匹配列的 MMM-yyyy 日期格式值作为条件when 然后:

    1. 使用to_date 将字符串值转换为基于我们作为参数提供的格式的有效日期,并且

    2. 使用last_date 获取MAIN_DATE 中每个咖喱日期所指的月份的最后一天。

    对于具有dd-MMM-yyyy 日期格式的“常规”行,在otherwise 方法中只需进行to_date 转换就足够了。

    之后,剩下要做的就是将日期转换回所需的dd-MMM-yyyy 格式(因为to_date 将给定日期转换为yyyy-MM-dd 格式)。

    这是 Scala 中的解决方案(拆分为两个 withColumns 以使其更具可读性,而不是单行):

    df.withColumn("END_DATE",
                when(length(col("MAIN_DATE")).equalTo(8), last_day(to_date(col("MAIN_DATE"), "MMM-yyyy")))
                  .otherwise(to_date(col("MAIN_DATE"), "dd-MMM-yyyy")))
    .withColumn("END_DATE", date_format(col("END_DATE"), "dd-MMM-yyyy"))
    

    这就是生成的df DataFrame 的样子:

    +---+-----------+-----------+
    |SEQ|  MAIN_DATE|   END_DATE|
    +---+-----------+-----------+
    |  1|16-JAN-2020|16-Jan-2020|
    |  2|   FEB-2017|28-Feb-2017|
    +---+-----------+-----------+
    

    【讨论】:

    • 感谢课程!
    猜你喜欢
    • 1970-01-01
    • 2019-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多