我正在学习如何使用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]))
对于如何发生这种情况的任何想法都会受到赞赏?!
答案 0 :(得分:1)
PythonRDD
和ParallelCollectionRDD
之间的区别在这里完全无关紧要。你的代码是错的。
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)