什么是幽灵?它与mapPartitions有何不同?

时间:2016-03-02 04:27:34

标签: apache-spark rdd

我在RDD上遇到过glom()方法。根据文件

  

返回通过将每个分区中的所有元素合并为数组而创建的RDD

glom是否会跨分区对数据进行混洗,还是仅将分区数据作为数组返回?在后一种情况下,我认为使用mapPartitions可以实现同样的目标。

我还想知道是否有任何用例受益于glom

4 个答案:

答案 0 :(得分:8)

  

glom是否跨分区对数据进行洗牌

不,它没有

  

如果这是第二种情况,我相信使用mapPartitions可以实现相同的效果

它可以:

rdd.mapPartitions(iter => Iterator(_.toArray))

但同样的事情也适用于mapflatMapfilter之类的非混洗变换。

  

如果有任何用例受益于glob。

您需要以可遍历多次的形式访问分区数据的任何情况。

答案 1 :(得分:0)

glom()将每个分区转换为元素的元组(immutabe列表)。它创建一个RDD元组。每个分区一个元组。

答案 2 :(得分:0)

“ ... Glom() 通常,火花不允许工作人员引用RDD中的特定元素。 保持语言整洁,但可能是一个主要限制。 glom()将每个分区转换为元素的元组(immutabe列表)。 创建一个RDD的tules。每个分区一个元组。 工人可以按索引引用分区的元素。 但是您不能为元素分配值,因此RDD仍然是不变的。 现在我们可以理解上面用来计算每个分区中元素数量的命令。 我们使用glom()使每个分区成为一个元组。 我们在每个分区上使用len来获取元组的长度-分区的大小。 *我们collect将结果打印出来。

答案 3 :(得分:0)

glom() 函数返回一个 RDD,它是通过将每个分区中的所有元素分组到一个列表中创建的(称为元组,因为它是一个不可变的列表)。 你可以这样排序 - rdd = sc.parallelize([1, 2, 3, 4], 2) sorted(rdd.glom().collect()) [[1, 2], [3, 4]]