可以传递给SparkContext.parallelize
创建RDD的元素有哪些限制?更具体地说,如果我在Python中创建自定义类,我需要实现哪些方法才能确保它在RDD中正常工作?我假设它需要实现__eq__
和__hash__
并且可以选择。还有什么?非常感谢有关文件的链接。我无处可寻。
答案 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.
此外,所有带闭包的变量都必须是可序列化的。