【发布时间】:2021-09-03 12:59:12
【问题描述】:
我有一个包含两列(SEQ - 整数,MAIN_DATE - 日期)的 spark 数据框:
现在我想根据条件添加一列,如果 MAIN_DATE 的格式为“MMM-YYYY”,则应将其转换为该月的最后一天,新数据框应如下所示:
任何建议将不胜感激。
【问题讨论】:
标签: scala dataframe apache-spark pyspark apache-spark-sql
我有一个包含两列(SEQ - 整数,MAIN_DATE - 日期)的 spark 数据框:
现在我想根据条件添加一列,如果 MAIN_DATE 的格式为“MMM-YYYY”,则应将其转换为该月的最后一天,新数据框应如下所示:
任何建议将不胜感激。
【问题讨论】:
标签: scala dataframe apache-spark pyspark apache-spark-sql
您可以使用 Spark 的 when/otherwise 方法,以便对 MAIN_DATE 列的每种不同日期格式进行不同的操作。
更具体地说,您可以简单地根据字段的字符串长度(因为我们知道这些值我们总是有 8 个字符)匹配列的 MMM-yyyy 日期格式值作为条件when 然后:
对于具有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|
+---+-----------+-----------+
【讨论】: