Counts of field based on other field in a RDD in pyspark
使用pyspark,我有一个看起来像这样的RDD
1 | [("a", 0), ("b", 1), ("a", 1), ("a", 0)] |
我想做的是根据第三个字段基于第一个字段的计数构建另一个RDD。如此有效的是:
1 | [("a", 0, 2), ("a", 1, 1), ("b", 1, 1)] |
这意味着存在" a"的两个实例,其中第三字段等于0,并且存在一个" a"的实例,其中第三字段等于1,并且存在一个实例" b",第三字段等于1。
我可以通过使用reduceByKey as
轻松获得第一字段的不同计数
rdd = sc.parallelize([("a", 0, 2), ("a", 1, 1), ("b", 1, 1)])
.map(lambda row: (row[0], 1))
.reduceByKey(add)
但是这只会给我计数" a"和" b",而与第三字段无关。我将如何获得它呢?
如果对您的问题的理解很好,您可能正在寻找这样的东西:
1 2 3 4 5 6 7 8 9 | from operator import add rdd = sc.parallelize([("a", 0), ("b", 1), ("a", 1), ("a", 0)]) .map(lambda row: ((row[0],row[1]), 1)) .reduceByKey(add) .map(lambda row : (row[0][0],row[0][1],row[1])) print(rdd.collect()) #?[('a', 1, 1), ('a', 0, 2), ('b', 1, 1)] |