如何在PySpark DataFrame中按品牌筛选Top2热门车型?
解决PySpark获取各品牌前2热门车型的问题
实现步骤
不需要手动遍历品牌,用PySpark的窗口函数就能高效解决,步骤如下:
- 统计品牌-车型的出现次数
先对make和model分组,计算每个组合的出现次数:
from pyspark.sql import functions as F count_df = df.groupBy("make", "model").agg(F.count("*").alias("count"))
- 用窗口函数给每个品牌下的车型排名
创建一个按make分组、按count降序排序的窗口,然后给每个组内的车型添加排名:
from pyspark.sql.window import Window window_spec = Window.partitionBy("make").orderBy(F.desc("count")) ranked_df = count_df.withColumn("rank", F.row_number().over(window_spec))
这里用row_number()会给相同计数的车型分配不同排名,如果想让相同计数的车型获得相同排名(比如并列第一的都保留),可以换成rank()或dense_rank()。
- 过滤保留前2名的车型
筛选出排名小于等于2的行,就是每个品牌的前2热门车型:
top2_models = ranked_df.filter(F.col("rank") <= 2)
完整代码示例
from pyspark.sql import SparkSession from pyspark.sql import functions as F from pyspark.sql.window import Window # 初始化SparkSession(如果还没初始化) spark = SparkSession.builder.appName("TopModels").getOrCreate() # 假设df是你的原始DataFrame count_df = df.groupBy("make", "model").agg(F.count("*").alias("count")) window_spec = Window.partitionBy("make").orderBy(F.desc("count")) ranked_df = count_df.withColumn("rank", F.row_number().over(window_spec)) top2_models = ranked_df.filter(F.col("rank") <= 2) # 查看结果 top2_models.show()
这种方法完全不需要手动遍历品牌,利用PySpark的分布式计算能力,处理大型DataFrame效率更高。
内容的提问来源于stack exchange,提问作者Lieuwe
相关产品推荐
相关产品推荐

