Spark - 如何对JavaPairRDD中分组的值的数量保持最大限制

时间:2018-01-22 02:03:38

标签: java apache-spark bigdata rdd

我有这样的RDD:

JavaPairRDD<String, String> 

有很多条目和一些键重复很多次。当我应用groupByKeycombineByKey时,会生成另一个

JavaPairRDD<String, Iterable<String>

问题是,对于某些键组,值的数量非常大(因为特定的键是倾斜的)。这导致进一步下游消费的问题,甚至产生内存问题。

我的问题是如何限制每个密钥聚合的值的数量。我想按键分组,但值列表不应超出限制X数。应该将任何溢出值添加到新行,有没有办法做到这一点?

1 个答案:

答案 0 :(得分:-1)

这可以使用flatMap来解决。我不知道如何用Java编写它,但是,希望你可以转换Scala代码。带示例输入的代码:

val rdd = spark.sparkContext.parallelize(Seq((1, Iterable(1,2,3,4,5)), (2, Iterable(6,7,8)), (3, Iterable(1,3,6,8,4,2,7,8,3))))

val maxLength = 3
val res = rdd.flatMap{ case(id, vals) =>
  vals.grouped(maxLength).map(v => (id, v))
}

我们的想法是将列表拆分为列表,其中每个内部列表都有一个最大长度。由于此处使用了flatMap,因此列表列表将被展平为一个简单的列表,这是您想要的结果。使用最大长度3并打印res可以得到:

(1,List(1, 2, 3))
(1,List(4, 5))
(2,List(6, 7, 8))
(3,List(1, 3, 6))
(3,List(8, 4, 2))
(3,List(7, 8, 3))