如何将行减少到它们的频率?

时间:2017-05-18 21:03:29

标签: apache-spark pyspark apache-spark-sql

我有数据框,其中行由两个字符串组成,用户ID为A,用户ID为B:

1234, 3456
1234, 5678
3456, 1234
1234, 3456

我希望将其转换为:

1234: (3456, 2), (5678, 1)
3456: (1234, 1)

每个唯一列A值一行,以及每个唯一列B值在具有该唯一列A值的行中出现的次数。

如果我在A列中过滤到只有一个用户ID,我知道我可以知道每个其他用户ID出现在B列的频率:

df.rdd.map(lambda row: (row['columnB'], 1)).reduceByKey(lambda x,y: x+y)

但作为Spark n00b,我无法弄清楚如何为所有用户做到这一点。

1 个答案:

答案 0 :(得分:3)

尝试聚合

from pyspark.sql.functions immport *

cnts = df.groupBy("columnA", "columnB").count()

collect_list

cnts.groupBy("columnA").agg(collect_list(struct(col("columnA"), col("count"))))