2016-08-14 12 views
0

を使用してRDDのグループ化:は、私は、これらの要素とRDDを持つ配列

("a", Array(1, 2)) | ("b", Array(3, 4)) | ("c", Array(1, 2)) 

私はそれがこれを持っているために、配列を使用して、グループに望む:

(Array("a", "c"), Array(1, 2)) | (Array("b"), Array(3, 4)) 

それを行う方法(好ましくはScalaで)?

+0

これは簡単ですが、試してみましたか? – Dici

答えて

2

あなたはスパークのデフォルトのパーティショナを使用してキーとして配列を使用することはできませんので、あなたは、リストに変換アレイによってグループに持って、その後直後バックあなたがしている構造に結果をマップします:

val input: RDD[(String, Array[Int])] = ??? 

val result: RDD[(Array[String], Array[Int])] = input 
    .groupBy(_._2.toList) // group by array 
    .values // keep values only, of type Iterable[(String, Array[Int])] 
    .map(it => (it.map(_._1).toArray, it.head._2)) // map back to requested format 
+0

SparkはこのRDDのパーティショナーについて忘れてしまうので、最後の 'map'はデータの分割を効果的に破壊します。 OPが望んでいるものによってはOKかもしれませんが、言及する価値があります – Dici

+0

リストに要素を格納できるので、この制限はわかりませんでした。グループ化を簡略化するために最初のRDDを改善します。説明とコードをありがとう。 –

+0

@ArmandGrilletはあなたにとって重要なパーティショニングですか?ペアになったRDDで 'map'を呼び出すと、RDDのパーティションメタデータを削除することになります。 – Dici

関連する問題