我有一个DataFrame
,其中一列名为problem_id
,其中包含一个标识整个数据集的一小部分的键。
我不清楚keyBy
+ partitionBy(N)
+ mapPartitions
是否会将我的数据集划分为N=|problem_id|
个分区,以便我可以执行在我定义的每个分区上并行一些代码。
否则,我怎么能继续实现这个结果呢?
基本上,我需要将一个函数应用于共享相同problem_id
的所有行。在sparkR中有gapply
函数,但它在Scala或Python中的等价物是什么?
答案 0 :(得分:1)
默认分区程序(HashPartitioner
)是一个异常分区,因此可以将多个密钥散列到同一分区。
gapply
的直接等效值为groupBy
,后跟mapValues
。如果分组列的基数相当低,您可以使用双射分割器:
pmap = rdd.keys().distinct().zipWithIndex().collectAsMap()
(rdd
.partitionBy(
numPartitions=len(parition_map),
partitionFunc=lambda x: pmap[x])
.mapPartitions(...))
最后你可以repartitionAndSortWithinPartitions
:
(rdd
.repartitionAndSortWithinPartitions()
.mapPartitions(...))
并跟踪更改密钥。