【问题标题】:what's the difference between rdd from PythonRDD and ParallelCollectionRDDPythonRDD 中的 rdd 和 ParallelCollectionRDD 有什么区别
【发布时间】:2016-02-24 03:50:31
【问题描述】:

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

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

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

ParallelCollectionRDD 加载为 id 和描述:

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])

或者干脆

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

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

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

def countTokens(vendorRDD):
    return vendorRDD.map(lambda l: (l[0],len(l[1]))).reduce(lambda a,b: a[1] + b[1])

任何关于这是如何发生的想法将不胜感激?!

【问题讨论】:

    标签: python apache-spark pyspark


    【解决方案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)
    

    【讨论】:

    • 您好,但它与 ParallelCollectionRDD 一起使用相同的 map 和 reduce 函数。这就是困扰我的地方..
    • 如果您有疑问,请查看我对 stackoverflow.com/a/35190202/1560062stackoverflow.com/a/35132794/1560062 的回答。这些应该说明为什么不正确地使用类似折叠的方法会根据数据分布产生不可预测的结果。
    • 那么两者有什么区别
    猜你喜欢
    • 2017-02-22
    • 1970-01-01
    • 2019-07-24
    • 2016-05-27
    • 2014-06-19
    • 2014-08-07
    • 1970-01-01
    • 2019-12-25
    • 2021-11-19
    相关资源
    最近更新 更多