PythonRDD和ParallelCollectionRDD的rdd有什么区别

时间:2016-02-24 03:50:31

标签: python apache-spark pyspark

我正在学习如何使用Python中的Spark进行编程并解决一个问题。

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

_##___________________####
#####________________#####
######______________######
_#######____________######
___########________#######
____#########_____#######_
______########____#######_
_______#########__#######_
___________######_#####___
______________########____
________#############_____
______#################___
_____###(__)############___
____###################___
___#####################__
____###################___
_____#################____
_________##########_______
________#############_____
______################____
_____####/ ######## \####___
____####/ ########## \####__
___####/ ############ \###_
___###/ ############# |###_
___###| ############## /##_
___###\ ############# /##___
____##################____
_____################_____
______##############______
_______############_______
_______############_______
_______############_______
_______############_______
_______#####__#####_______
_______####____####_______
______#####____#####______
___########____########___
___########____########___ 

ParallelCollectionRDD作为id和description加载:

pythonRDD.take(1)
## [('b000jz4hqo', ['clickart', '950', '000', 'premier', 'image', 'pack', 'dvd', 'rom', 'broderbund'])]

我可以像这样计算paraRDD:

paraRDD.take(1)
## [('b000jz4hqo', ['clickart', '950', '000', 'premier', 'image', 'pack', 'dvd', 'rom', 'broderbund'])]

或只是

paraRDD.map(lambda l: (l[0],len(l[1]))).reduce(lambda a,b: a[1] + b[1])

但是在pythonRDD上它遇到了bug,bug说:

  

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

paraRDD.reduce(lambda a,b: len(a[1]) + len(b[1]))

对于如何发生这种情况的任何想法都会受到赞赏?!

1 个答案:

答案 0 :(得分:1)

PythonRDDParallelCollectionRDD之间的区别在这里完全无关紧要。你的代码是错的。

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

(T, T) => T

换句话说,参数和返回的对象必须属于同一类型,操作顺序和括号不能影响最终结果。传递给reduce的函数根本不符合这些条件。

为了使它成功,你需要这样的东西:

rdd.map(lambda l: len(l[1])).reduce(lambda x, y: x + y)

甚至更好:

from operator import add

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