我有一个DataFrame
,其中一列称为problem_id
,包含一个键,用于标识整个数据集的一小部分。
我不清楚keyBy
+partitionBy(N)
+mapPartitions
是否会将我的数据集划分为N=|problem_id|
分区,这样我就可以在每个定义的分区上并行执行一些代码。
否则,我怎样才能达到这个结果呢?基本上,我需要将一个函数应用于共享同一problem_id
的所有行。在sparkR中有gapply
函数,但它在Scala或Python中的等价函数是什么?
默认分区器(HashPartitioner
)是一个满射,因此多个键可以散列到同一分区。
- SparkR中
gapply
的直接等价物是groupBy
,然后是mapValues
-
若分组列的基数比较低,可以使用双射partitoner:
pmap = rdd.keys().distinct().zipWithIndex().collectAsMap() (rdd .partitionBy( numPartitions=len(parition_map), partitionFunc=lambda x: pmap[x]) .mapPartitions(...))
-
最后你可以
repartitionAndSortWithinPartitions
:(rdd .repartitionAndSortWithinPartitions() .mapPartitions(...))
并跟踪更改关键帧。