PySpark不使用groupBy/agg通过withColumn统计列值出现次数方案
解决方案
完全可以通过withColumn()配合PySpark窗口函数实现,不需要使用groupBy()+agg()压缩原表行数,可完整保留原有DataFrame的所有行和结构。
实现逻辑
窗口函数支持按指定列分区后做聚合计算,且聚合结果会回填到当前分区的每一行,刚好匹配你要的同值行统计结果一致的需求。
完整代码示例
# 导入依赖 from pyspark.sql import SparkSession from pyspark.sql import functions as F from pyspark.sql.window import Window # 初始化SparkSession(已有可省略) spark = SparkSession.builder.appName("value_count").getOrCreate() # 构造测试数据(和你示例的出现次数对应:10出现3次、20出现4次、30出现9次) test_data = [(10,), (10,), (10,), (20,), (20,), (20,), (20,), *[(30,) for _ in range(9)]] df = spark.createDataFrame(test_data, schema=["col1"]) # 定义窗口规则:按统计列col1分区 count_window = Window.partitionBy("col1") # 新增count_col列,统计每个col1取值的总出现次数 result_df = df.withColumn("count_col", F.count("*").over(count_window)) # 输出验证结果 result_df.show()
效果说明
运行后所有行完整保留,col1取值相同的行count_col值完全一致,和你要求的效果完全匹配:
col1 = 10的所有行count_col = 3col1 = 20的所有行count_col = 4col1 = 30的所有行count_col = 9
如果需要统计多列组合的出现次数,只需修改partitionBy的入参即可,例如Window.partitionBy("col1", "col2")就是统计col1+col2组合的总出现次数。
内容的提问来源于stack exchange,提问作者abc
相关产品推荐
相关产品推荐

