首先,您可以使用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|
+-------+----+----------+-----+