PySpark如何按日期分组notification_date后对num列求和并降序排序
这个需求完全可以实现,两种常用实现方案如下:
方案1:直接在SQL语句中完成全逻辑
如果对SQL语法更熟悉,可以直接把分组、聚合、排序逻辑都写在SQL语句里:
from pyspark.sql.functions import col, desc # 保留lhd_2010_name、lhd_2010_code字段的写法,需将这两个字段也加入分组条件 results = spark.sql(""" SELECT lhd_2010_name, lhd_2010_code, notification_date, SUM(num) AS total_num FROM cases_df GROUP BY lhd_2010_name, lhd_2010_code, notification_date ORDER BY total_num DESC """) # 仅需要日期和对应求和结果的简化写法 # results = spark.sql(""" # SELECT # notification_date, # SUM(num) AS total_num # FROM cases_df # GROUP BY notification_date # ORDER BY total_num DESC # """) results.show() spark.stop()
方案2:用PySpark DataFrame API实现
如果后续还要对结果做其他DataFrame操作,这种方式灵活性更高:
from pyspark.sql.functions import col, desc, sum as spark_sum # 先查询基础数据 base_df = spark.sql("SELECT lhd_2010_name, lhd_2010_code, notification_date, num FROM cases_df") # 保留地区字段的分组聚合排序写法 results = base_df.groupBy("lhd_2010_name", "lhd_2010_code", "notification_date") \ .agg(spark_sum("num").alias("total_num")) \ .orderBy(desc("total_num")) # 仅按日期分组的简化写法 # results = base_df.groupBy("notification_date") \ # .agg(spark_sum("num").alias("total_num")) \ # .orderBy(desc("total_num")) results.show() spark.stop()
两种方案性能基本一致,按需选择即可。
内容的提问来源于stack exchange,提问作者CKZ
相关产品推荐
相关产品推荐

