Spark RDD中的哪些对象可以是元素?

时间:2017-06-03 12:20:36

标签: python python-3.x apache-spark pyspark rdd

可以传递给SparkContext.parallelize创建RDD的元素有哪些限制?更具体地说,如果我在Python中创建自定义类,我需要实现哪些方法才能确保它在RDD中正常工作?我假设它需要实现__eq____hash__并且可以选择。还有什么?非常感谢有关文件的链接。我无处可寻。

1 个答案:

答案 0 :(得分:1)

严格来说,唯一的硬性要求是类是可序列化的(可选择的),尽管对于生命周期仅限于单个任务的对象(既不是洗牌也不是收集/并行化)都没有必要。

只有当类被用作shuffle键时才需要一致__hash____eq__,可以直接(作为byKey操作中的键)或间接使用(例如distinct 1}}或cache)。

此外,类定义必须可在每个工作节点上导入,因此模块必须已存在于PYTHONPATH上,或与pyFiles一起分发。如果class依赖于本机依赖项,​​那么这些依赖项也必须存在于每个工作节点上。

最后,对于排序类型必须使用标准Python语义进行订购。

总结:

  • 除可导入外,没有特殊要求:

    class Foo:
       ...
    
    # objects are used locally inside a single task
    rdd.map(lambda i: Foo(i)).map(lambda foo: foo.get(i))
    
  • 必须可序列化:

    # Has to be pickled to be distributed 
    sc.parallelize([Foo(1), Foo(2)])
    
    # Has to be pickled to be persisted
    sc.range(10).map(lambda i: Foo(i)).cache()
    
    # Has to be pickled to be fetched to the driver
    sc.range(10).map(lambda i: Foo(i)).collect()  # take, first, etc.
    
  • 必须是Hashable

    # Explicitly used as a shuffle key
    sc.range(10).map(lambda i: (Foo(i), 1)).reduceByKey(add)  # *byKey
    
    # Implicitly used as a shuffle kye
    sc.range(10).map(lambda i: Foo(i)).distinct  # subtract, etc.
    

此外,所有带闭包的变量都必须是可序列化的。