簡體   English   中英

Spark-如何保持對JavaPairRDD中分組的值的數量的最大限制

[英]Spark - How to keep max limit on number of values grouped in JavaPairRDD

我有一個這樣的RDD:

JavaPairRDD<String, String> 

其中包含很多條目,並且某些鍵重復了很多次。 當我申請或者groupByKeycombineByKey ,其生成另一

JavaPairRDD<String, Iterable<String>

這是問題所在,對於某些鍵集,值的數量非常大(因為特定鍵偏斜)。 這導致進一步的下游消耗問題,甚至產生內存問題。

我的問題是如何限制每個鍵匯總的值數量。 我想按鍵分組,但是值列表不應超出限制X數。 任何溢出的值都應添加到新行中,有沒有辦法做到這一點?

這可以使用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))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM