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

时间:2017-01-26 16:38:00

标签: python-2.7 apache-spark pyspark apache-spark-sql

我有一个DataFrame,其中一列名为problem_id,其中包含一个标识整个数据集的一小部分的键。

我不清楚keyBy + partitionBy(N) + mapPartitions是否会将我的数据集划分为N=|problem_id|个分区,以便我可以执行在我定义的每个分区上并行一些代码。

否则,我怎么能继续实现这个结果呢? 基本上,我需要将一个函数应用于共享相同problem_id的所有行。在sparkR中有gapply函数,但它在Scala或Python中的等价物是什么?

1 个答案:

答案 0 :(得分:1)

默认分区程序(HashPartitioner)是一个异常分区,因此可以将多个密钥散列到同一分区。

  • SparkR中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(...))
    

    并跟踪更改密钥。