什么';是PythonRDD和ParallelCollectionRDD的区别吗
我正在学习如何用Python中的Spark编程,并努力解决一个问题 问题是我有一个PythonRDD作为id和description加载:什么';是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
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一起工作。这就是困扰我的地方。如果你有疑问,看看我的答案,这些应该说明为什么不正确地使用折叠方法会根据数据分布产生不可预测的结果。那么两者之间的区别是什么呢