如何使用PySpark对逗号分隔的时间字符串值进行升序排序?
PySpark实现逗号分隔时间字符串列的升序排序
要把values列里的逗号分隔时间字符串按升序排列,你可以用PySpark的字符串处理、数组排序函数组合完成,具体实现如下:
1. 创建测试DataFrame
先模拟你提供的原始数据:
from pyspark.sql import SparkSession from pyspark.sql.functions import split, array_sort, concat_ws # 初始化SparkSession spark = SparkSession.builder.appName("SortTimeStrings").getOrCreate() # 构建测试数据 data = [ (1, "2023-04-02, 2023-02-01, 2023-01-04"), (2, "2023-02-01, 2023-01-04, 2023-02-07"), (3, "2023-01-08, 2023-01-05, 2023-01-02") ] df = spark.createDataFrame(data, ["id", "values"]) df.show(truncate=False)
2. 执行排序逻辑
通过三个核心函数完成处理:
split("values", ", "):把逗号加空格分隔的字符串拆成字符串数组array_sort(...):对数组进行升序排序(因为你的时间是yyyy-MM-dd格式,字符串排序和时间逻辑排序结果一致,直接用这个函数即可)concat_ws(", ", ...):把排序后的数组重新拼接成逗号分隔的字符串
代码如下:
sorted_df = df.withColumn( "values", concat_ws(", ", array_sort(split("values", ", "))) ) sorted_df.show(truncate=False)
结果验证
运行后会得到你想要的排序结果:
+---+---------------------------------------+ |id |values | +---+---------------------------------------+ |1 |2023-01-04, 2023-02-01, 2023-04-02 | |2 |2023-01-04, 2023-02-01, 2023-02-07 | |3 |2023-01-02, 2023-01-05, 2023-01-08 | +---+---------------------------------------+
如果你的时间格式不是yyyy-MM-dd(比如是MM/dd/yyyy),需要先把数组元素转换成日期类型再排序,最后转回字符串,调整代码如下:
from pyspark.sql.functions import transform, to_date, date_format sorted_df = df.withColumn( "values", concat_ws(", ", array_sort( transform( split("values", ", "), lambda x: to_date(x, "yyyy-MM-dd") ) ) ) ).withColumn( "values", concat_ws(", ", transform(split("values", ", "), lambda x: date_format(x, "yyyy-MM-dd"))) )
内容的提问来源于stack exchange,提问作者sclee1
相关产品推荐
相关产品推荐

