PySpark中Group By与聚合函数使用问题:日期MIN取值异常
问题原因
DATE列存储为字符串类型,格式为dd-MM-yyyy,直接调用min()函数时,PySpark会按照字符串字典序进行比较,而非日期的实际先后逻辑。这种格式的字符串从左到右逐字符对比(先比日,再比月,最后比年),和日期的自然排序逻辑(年→月→日)完全不符,导致聚合结果不符合预期。
解决方案
先将字符串类型的DATE列转换为PySpark日期类型,再执行分组聚合操作,具体代码如下:
from pyspark.sql.functions import count, min, to_date, col # 1. 转换字符串日期为日期类型,指定格式为dd-MM-yyyy # 2. 按运动类型分组,计算计数和最小日期 # 3. 过滤出计数大于1的分组 # 4. 可选:将日期类型转回原字符串格式 df_result = df.withColumn("parsed_date", to_date(col("DATE"), "dd-MM-yyyy")) \ .groupBy("SPORTS_INTERESTED") \ .agg( count("SPORTS_INTERESTED").alias("FIRST_COUNT"), min("parsed_date").alias("MIN_OF_DATE_COLUMN") ) \ .filter(col("FIRST_COUNT") > 1) \ .withColumn("MIN_OF_DATE_COLUMN", col("MIN_OF_DATE_COLUMN").cast("string")) # 查看结果 df_result.show()
执行后输出符合预期:
+-----------------+-------------------+ |SPORTS_INTERESTED|MIN_OF_DATE_COLUMN| +-----------------+-------------------+ | CRICKET| 23-09-2020| | FOOTBALL| 13-09-2021| +-----------------+-------------------+
核心要点
to_date(col("DATE"), "dd-MM-yyyy"):将字符串按指定格式解析为日期类型,此时PySpark会遵循日期的自然排序逻辑比较大小。- 若无需保留字符串格式,可省略最后的
cast("string")步骤,直接输出日期类型结果。
内容的提问来源于stack exchange,提问作者BigData Lover
相关产品推荐
相关产品推荐

