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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/EmptyTag/132.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
什么';是PythonRDD和ParallelCollectionRDD的区别吗_Python_Apache Spark_Pyspark - Fatal编程技术网

什么';是PythonRDD和ParallelCollectionRDD的区别吗

什么';是PythonRDD和ParallelCollectionRDD的区别吗,python,apache-spark,pyspark,Python,Apache Spark,Pyspark,我正在学习如何用Python中的Spark编程,并努力解决一个问题 问题是我有一个PythonRDD作为id和description加载: pythonRDD.take(1) ## [('b000jz4hqo', ['clickart', '950', '000', 'premier', 'image', 'pack', 'dvd', 'rom', 'broderbund'])] 和作为id和说明加载的ParallelCollectionRDD: paraRDD.take(1) ## [('b

我正在学习如何用Python中的Spark编程,并努力解决一个问题

问题是我有一个PythonRDD作为id和description加载:

pythonRDD.take(1)
## [('b000jz4hqo', ['clickart', '950', '000', 'premier', 'image', 'pack', 'dvd', 'rom', 'broderbund'])]
和作为id和说明加载的ParallelCollectionRDD:

paraRDD.take(1)
## [('b000jz4hqo', ['clickart', '950', '000', 'premier', 'image', 'pack', 'dvd', 'rom', 'broderbund'])]
我可以像这样对paraRDD进行计数:

paraRDD.map(lambda l: (l[0],len(l[1]))).reduce(lambda a,b: a[1] + b[1])
rdd.map(lambda l: len(l[1])).reduce(lambda x, y: x + y)
或者干脆

paraRDD.reduce(lambda a,b: len(a[1]) + len(b[1]))
但是在Pythonrd上它遇到了bug,bug说:

“TypeError:'int'对象没有属性'getitem'。”


如果你知道这是怎么发生的,我将不胜感激

在这里,
PythonRDD
ParallelCollectionRDD
之间的差异是完全无关的。你的代码错了

reduce
方法采用具有以下签名的关联和交换函数:

(T, T) => T
换句话说,参数和返回的对象必须是相同的类型,并且操作顺序和括号不能影响最终结果。传递给
reduce
的函数根本不满足这些条件

要使其正常工作,您需要以下内容:

paraRDD.map(lambda l: (l[0],len(l[1]))).reduce(lambda a,b: a[1] + b[1])
rdd.map(lambda l: len(l[1])).reduce(lambda x, y: x + y)
或者更好:

from operator import add

rdd.values().map(len).reduce(add)

您好,但是它使用相同的map和reduce函数与ParallelCollectionRDD一起工作。这就是困扰我的地方。如果你有疑问,看看我的答案,这些应该说明为什么不正确地使用折叠方法会根据数据分布产生不可预测的结果。那么两者之间的区别是什么呢