我在RDD上遇到过glom()
方法。根据文件
返回通过将每个分区中的所有元素合并为数组而创建的RDD
glom
是否会跨分区对数据进行混洗,还是仅将分区数据作为数组返回?在后一种情况下,我认为使用mapPartitions
可以实现同样的目标。
我还想知道是否有任何用例受益于glom
。
答案 0 :(得分:8)
glom
是否跨分区对数据进行洗牌
不,它没有
如果这是第二种情况,我相信使用mapPartitions可以实现相同的效果
它可以:
rdd.mapPartitions(iter => Iterator(_.toArray))
但同样的事情也适用于map
,flatMap
或filter
之类的非混洗变换。
如果有任何用例受益于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]]