我有数据框,其中行由两个字符串组成,用户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,我无法弄清楚如何为所有用户做到这一点。
答案 0 :(得分:3)
尝试聚合
from pyspark.sql.functions immport *
cnts = df.groupBy("columnA", "columnB").count()
cnts.groupBy("columnA").agg(collect_list(struct(col("columnA"), col("count"))))