什么是 glom?它与 mapPartitions 有何不同?

What is a glom?. How it is different from mapPartitions?

我在 RDD 上遇到了 glom() 方法。根据文档

Return an RDD created by coalescing all elements within each partition into an array

glom 是跨分区随机移动数据还是仅 return 将分区数据作为数组?在后一种情况下,我相信使用 mapPartitions.

可以达到同样的效果

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

Does glom shuffle the data across partitions

不,不是

If this is the second case I believe that the same can be achieved using mapPartitions

它可以:

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

但同样的事情适用于任何非洗牌转换,如 mapflatMapfilter

if there are any use cases which benefit from glob.

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

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

"... Glom() 通常,spark 不允许 worker 引用 RDD 的特定元素。 保持语言干净,但可能是一个主要限制。 glom() 将每个分区转换为元素的元组(不变列表)。 创建 tules 的 RDD。每个分区一个元组。 工作人员可以通过索引引用分区的元素。 但是你不能给元素赋值,RDD 仍然是不可变的。 现在我们可以理解上面用来统计每个分区中元素个数的命令了。 我们使用 glom() 将每个分区做成一个元组。 我们在每个分区上使用 len 来获取元组的长度 - 分区的大小。 * 我们collect将结果打印出来。

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