Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache spark 由键值对列表组成的RDD上的reduceByKey?_Apache Spark_Pyspark - Fatal编程技术网

Apache spark 由键值对列表组成的RDD上的reduceByKey?

Apache spark 由键值对列表组成的RDD上的reduceByKey?,apache-spark,pyspark,Apache Spark,Pyspark,我需要计算RDD中元素的出现次数。如果我在RDD中有这样的字母计数,这将很容易: rdd = sc.parallelize([("a", 1), ("b", 1), ("a", 3)]) rdd.reduceByKey(lambda a,b: a+b).collect() #prints [('a', 4), ('b', 1)] rdd2 = sc.parallelize([[("a", 2), ("b", 1), ("c", 3)], [("a", 5), ("b", 2)]]) 但数据

我需要计算RDD中元素的出现次数。如果我在RDD中有这样的字母计数,这将很容易:

rdd = sc.parallelize([("a", 1), ("b", 1), ("a", 3)])
rdd.reduceByKey(lambda a,b: a+b).collect()  #prints [('a', 4), ('b', 1)]
rdd2 = sc.parallelize([[("a", 2), ("b", 1), ("c", 3)], [("a", 5), ("b", 2)]])
但数据的每个元素都来自一条推特,这意味着每个推特中通常会有几个字母的实例,如下所示:

rdd = sc.parallelize([("a", 1), ("b", 1), ("a", 3)])
rdd.reduceByKey(lambda a,b: a+b).collect()  #prints [('a', 4), ('b', 1)]
rdd2 = sc.parallelize([[("a", 2), ("b", 1), ("c", 3)], [("a", 5), ("b", 2)]])
将其组合到分布式的key/val元组数据集中(key=letters,val=total number of executions)的有效方法是什么

我考虑过的解决方案:

  • 首先将每个元素转换为字母列表,然后用λa,b:a+b进行缩减,然后制作一个计数器。这是可行的,但是会将大量数据发送到驱动程序节点,并且计数器在本地构建
  • 将每个元素转换为类似{“a”:2,“b”:1}的dict,编写一个方法来组合dict,并使用它进行reduce。我有点担心这一点,因为a)在Python中dict通常是通过引用传递的,我不确信我完全理解如果我在combiner方法中将dict a中的项添加到dict b中会得到什么行为。b) 我可以在combiner方法中创建一个新的dict,但这意味着在缩减时重复创建非常大的字典

任何帮助都将不胜感激。

只需
flatMap
reduceByKey

rdd2.flatMap(lambda x: x).reduceByKey(lambda x, y: x + y)
这将提供:

[('b', 3), ('c', 3), ('a', 7)]