PySpark如何统计id出现次数并在所有原行同步展示该计数值
要实现保留所有原行并关联同id的计数,使用窗口函数即可,groupBy分组聚合会压缩分组行,不符合你的需求,完整实现代码如下:
from pyspark.sql import SparkSession from pyspark.sql.window import Window import pyspark.sql.functions as F # 初始化Spark(如果你的环境已经初始化可以跳过这行) spark = SparkSession.builder.appName("id_count_calc").getOrCreate() # 示例DataFrame构造 data=[["1","2020-02-01"],["2","2019-03-01"],["3","2021-03-01"],["4",""],["5","2021-21-01"],["6","1900-01-01"],["6","2000-01-01"]] df=spark.createDataFrame(data,["id","input"]) # 定义按id分区的窗口规则 id_partition = Window.partitionBy("id") # 新增CountUnique字段,统计每个id分区下的行数 res_df = df.withColumn("CountUnique", F.count("*").over(id_partition)) # 输出指定字段,和你的预期结果完全一致 res_df.select("id", "CountUnique").orderBy("id").show()
运行后输出结果如下:
+---+-----------+ | id|CountUnique| +---+-----------+ | 1| 1| | 2| 1| | 3| 1| | 4| 1| | 5| 1| | 6| 2| | 6| 2| +---+-----------+
如果需要额外判断id是否唯一,可以再加一列计算布尔标识:
res_df = res_df.withColumn("is_unique", F.col("CountUnique") == 1)
内容的提问来源于stack exchange,提问作者abhishek gaikwad
相关产品推荐
相关产品推荐

