PySpark DataFrame按年份区间分组统计电影平均评分问题
PySpark按指定年份区间分组统计电影平均评分
核心思路
通过PySpark的条件判断函数生成年份区间字段,再按该字段分组计算平均评分,同时保留无上映年份的分组。
实现代码
首先导入PySpark SQL函数:
from pyspark.sql import functions as F
假设df是已加载的电影数据集DataFrame,执行以下操作:
# 生成年份区间字段 df_with_range = df.withColumn( "year_range", F.when(F.col("relYear").isNull(), "无上映年份") .when(F.col("relYear") >= 2000, "2000年及以后") .when(F.col("relYear").between(1990, 1999), "1990-1999") .when(F.col("relYear").between(1980, 1989), "1980-1989") .when(F.col("relYear").between(1970, 1979), "1970-1979") .when(F.col("relYear").between(1960, 1969), "1960-1969") .otherwise("1959年及更早") ) # 分组计算平均评分并按逻辑顺序排序 result = df_with_range.groupBy("year_range") \ .agg(F.round(F.avg("rating"), 2).alias("average_rating")) \ .orderBy( F.when(F.col("year_range") == "无上映年份", 0) .when(F.col("year_range") == "1959年及更早", 1) .when(F.col("year_range") == "1960-1969", 2) .when(F.col("year_range") == "1970-1979", 3) .when(F.col("year_range") == "1980-1989", 4) .when(F.col("year_range") == "1990-1999", 5) .when(F.col("year_range") == "2000年及以后", 6) ) # 输出结果 result.show()
关键说明
- 优先判断
relYear为空的情况,确保"无上映年份"分组被正确识别 otherwise直接覆盖1874-1959的所有年份,无需额外区间判断- 用
F.round对平均评分保留两位小数,结果更易读 - 自定义排序规则,避免字符串排序导致的区间顺序混乱
内容的提问来源于stack exchange,提问作者pang sai
相关产品推荐
相关产品推荐

