处理Spark(1.6.1)DataFrames的用户定义分区



我有一个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(...))
    

    并跟踪更改关键帧。

相关内容

  • 没有找到相关文章

最新更新