1

spark を使用して scala で何かを行う方法に関する問題の支援を探しています。

私は持っている:

type DistanceMap = HashMap[(VertexId,String), Int]

これは、次の RDD の形式で私のデータの一部を形成します。

org.apache.spark.rdd.RDD[(DistanceMap, String)] 

要するに、私のデータセットは次のようになります。

 ({(101,S)=3},piece_of_data_1)
 ({(101,S)=3},piece_of_data_2)
 ({(101,S)=1, (100,9)=2},piece_of_data_3)

私がやりたいことは、距離マップをフラットマップすることです(私ができることです)が、同時に、フラットマップされた各マップに対してDistanceMap、それに関連付けられた文字列を保持したいと考えています。したがって、結果のデータは次のようになります。

({(101,S)=3},piece_of_data_1))<br>
({(101,S)=3},piece_of_data_2))<br>
({(101,S)=1},piece_of_data_3))<br>
({(109,S)=2},piece_of_data_3))<br>

前述のように、次を使用して最初の部分を flatMap できます。

x.flatMap(x=>x._1).collect.foreach(println))

しかし、元のデータの 2 番目の部分から文字列を保持する方法にこだわっています。

4

2 に答える 2

0

アップデート

別の解決策があります-キーを値で反転し、flatMapValues 変換を使用してから、キーを値で再度反転します。擬似コードを参照してください。

x.map(x=>x._2, x._1).flatMapValues(x=>x).map(x=>x._2, x._1)

前のバージョン

前処理ステップを 1 つ追加することを提案します (残念ながら、明日まで scala インタープリターを備えたコンピューターが目の前になく、動作するコードを考え出すことができません)。

  1. ペア rdd(DistanceMap, String)を Tuple4 のリストを持つ rdd に変換します。List((VertexId,String, Int, String), ... ())
  2. 結果に flatMap を適用する

擬似コード:

rdd.map( (DistanceMap, String) =>  List((VertexId,String, Int, String), ... ()))
    .flatMap(x=>x)
于 2015-06-16T01:43:52.873 に答える