[英]Spark - How to keep max limit on number of values grouped in JavaPairRDD
我有一個這樣的RDD:
JavaPairRDD<String, String>
其中包含很多條目,並且某些鍵重復了很多次。 當我申請或者groupByKey
或combineByKey
,其生成另一
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.