我只是discovered RDD.zip()
方法,我无法想象它的contract是什么 可能是。
当然,我明白它的作用。不过,我一直认为
- RDD 中的元素顺序是一个毫无意义的概念
- 分区的数量及其大小是一个实现细节,仅供用户用于性能调整
换句话说,RDD 是一个(多)集合,而不是序列(当然,在 Python 中,人们会得到 AttributeError : 'set' 对象没有属性 'zip'
)
我上面的理解有什么问题吗?
这种方法背后的基本原理是什么?
在像a.map(f).zip(a)
这样的琐碎上下文之外它合法吗?
编辑1:
- 另一个疯狂的方法是
zipWithIndex()
,以及各种zipPartitions()
变体。 - 请注意
first()
和take()
不疯狂,因为它们只是 RDD 的(非随机)样本。 -
collect()
也没关系 - 它只是将set
转换为完全合法的sequence
。
编辑 2:reply说:
when you compute one RDD from another the order of elements in the new RDD may not correspond to that in the old one.
这似乎意味着即使是微不足道的 a.map(f).zip(a)
也不保证等同于a.map(x => (f(x),x))
。当 zip()
结果可重现时是什么情况?
最佳答案
RDD 总是无序的这一说法并不正确。例如,如果 RDD 是 sortBy
操作的结果,则它具有有保证的顺序。 RDD 不是一个集合;它可以包含重复项。分区对于调用者来说并不是不透明的,并且可以控制和查询。许多操作确实会保留分区和顺序,例如map
。也就是说,我发现很容易意外违反 zip
所依赖的假设,因为它们有点微妙,但它肯定有一个目的。
关于apache-spark - 令人震惊的 : RDD. zip() 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29268210/