关于Apache Spark:基于pyspark中RDD中其他字段的字段数

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)]