我正在学习如何用Python编写Spark程序,并解决一个问题。在
问题是我有一个PythonRDD作为id和description加载:
pythonRDD.take(1)
## [('b000jz4hqo', ['clickart', '950', '000', 'premier', 'image', 'pack', 'dvd', 'rom', 'broderbund'])]
以及作为id和description加载的ParallelCollectionRDD:
^{pr2}$我可以像这样数一数:
paraRDD.map(lambda l: (l[0],len(l[1]))).reduce(lambda a,b: a[1] + b[1])
或者干脆
paraRDD.reduce(lambda a,b: len(a[1]) + len(b[1]))
但在Python身上它遇到了虫子,虫子说:
"TypeError: 'int' object has no attribute 'getitem'".
def countTokens(vendorRDD):
return vendorRDD.map(lambda l: (l[0],len(l[1]))).reduce(lambda a,b: a[1] + b[1])
你知道这是怎么发生的吗?!在
PythonRDD
和{
^{1}$reduce
方法采用具有以下签名的关联和交换函数:换句话说,参数和返回的对象必须是同一类型的,操作顺序和括号不能影响最终结果。传递给
reduce
的函数根本不满足这些条件。在要想让它发挥作用,你需要这样的东西:
^{pr2}$甚至更好:
相关问题 更多 >
编程相关推荐