PySpark使用agg对同一列做多聚合时结果被覆盖如何解决
PySpark agg算子同列多聚合问题解决方案
问题根源
你传入agg的参数是Python字典,而Python字典的键具备唯一性,相同键的键值对会被后定义的覆盖,因此你写的两个date_time键对应的聚合规则,只会保留最后的min规则,所以看不到max的计算结果。
解决方法
不要使用字典传参的方式调用agg,改为显式传入pyspark.sql.functions下的聚合函数实例,可同时支持同一列的多个聚合操作,还支持自定义输出列名:
代码示例
首先导入依赖的函数:
from pyspark.sql import functions as F from pyspark.sql.functions import to_timestamp
修改后的聚合代码:
table.select("date_time")\ .withColumn("date", to_timestamp("date_time"))\ .agg( F.max("date_time").alias("max_date_time"), F.min("date_time").alias("min_date_time"), # 如需对转换后的timestamp类型的date列做聚合,可继续添加规则 F.max("date").alias("max_timestamp"), F.min("date").alias("min_timestamp") ).show()
补充说明
这种写法的灵活性更高,除了max、min外,count、avg、sum等所有聚合函数都可以用同样的方式传入,alias方法定义的列名更方便后续对聚合结果做进一步处理。
内容的提问来源于stack exchange,提问作者practicalGuy
相关产品推荐
相关产品推荐

