在Apache Spark中控制数据分区

时间:2015-09-24 03:50:47

标签: apache-spark apache-spark-sql spark-streaming

数据看起来像:

col 1 col 2 col 3 col 4
第1行第1行第1行第1行 第2行第2行第2行第2行 第3行第3行第3行第3行 第4行第4行第4行第4行 第5行第5行第5行第5行 第6行第6行第6行第6行

问题:我想对这些数据进行分区,假设第1行和第2行将作为一个分区处理,第3行和第4行作为另一个分区处理,第5行和第6行作为另一个分区处理,并创建将它们合并在一起的JSON数据列(包含行数据值的列标题)。

输出应该如下:
[
{COL1:ROW1,COL2:ROW1:COL3:ROW1:COL4:ROW1},
{COL1:ROW2,COL2:ROW2:COL3:ROW2:COL4:ROW2},
{COL1:ROW3,COL2:ROW3:COL3:ROW3:COL4:ROW3},
{COL1:ROW4,COL2:ROW4:COL3:ROW4:COL4:ROW4},...
]

我尝试在spark中使用repartion(num),但它并不是我想要的完全分区。因此生成的JSON数据无效。我遇到了为什么我的程序花了相同的时间来处理数据的问题,即使我使用了不同数量的核心here并且重新分配建议是由@Patrick McGloin建议的。该问题中提到的代码是我想要做的事情。

1 个答案:

答案 0 :(得分:3)

猜猜你需要的是 partitionBy 。在Scala中,您可以为其提供自定义构建HashParitioner,而在Python中则传递 partitionFunc 。 Scala中有很多例子,让我简单解释一下Python的味道。

partitionFunc 需要一个元组,第一个元素是键。让我们假设您以下列方式组织数据: (ROW_ID,(A,B,C,..))其中ROW_ID = [1,2,3,...,k]。您随时可以添加ROW_ID并将其删除。

每两行获取一个新分区:

rdd.partitionBy(numPartitions = int(rdd.count() / 2),
                partitionFunc = lambda key: int(key / 2)

partitionFunc 将生成一个序列0,0,1,1,2,2,...这个数字将是给定行所属的分区数。