多くの場合、経由などで取得するには、ユーザIDとして、シーンを介して取得するIDを行うことが必要とされ、
抽象的問題は、データの各々から解決できるKVペアの一つ以上である:特定のKVペアマッチングする必要があり(ID_TYPE、ID)、及び複数のデータマージです。
例えば:
DATA1:配列(( 'タイプ1'、 'ID1')、( 'TYPE2'、 'ID2'))
DATA2:配列(( 'タイプ1'、 'ID1')、( 'TYPE3'、 'ID3'))
DATA3:配列(( 'タイプ2'、 'ID2')、( 'TYPE4'、 'ID4'))
前記DATA1とDATA2によって( 'TYPE1'、 'ID1')によってオープン、DATA1とDATA3( 'タイプ2'、 'ID2')が開き、最終DATA1、DATA2、DATA3オープンデータに
data_union:配列(( 'タイプ1'、 'ID1')、( 'TYPE2'、 'ID2')、( 'TYPE3'、 'ID3')、( 'TYPE4'、 'ID4'))
基底クラスとメソッドを定義します。
クラスデータ{ DEFのgetId:文字列= "" } DEFマージ(dataArr:配列[(MAP [バイト、文字列]、データ)]):(MAP [バイト、文字列]、データ)= dataArr.head DEF generateUUID:文字列= 「」
間で
1)データは、それぞれデータIDを有し、データの抽象化を表します。
2)地図[バイト、文字列] KV対データを表し、すなわちマップ[ID_TYPE、ID]
3)データトランザクションを複数に開くことマージ。
最も単純な再帰の実装を見てください
DEF unionDataRDD1(RDD:RDD [(MAP [バイト、文字列]、データ)]):RDD [(MAP [バイト、文字列]、データ)] = { VAR結果 = rdd.keyBy(_._ 2.getId).groupByKey .MAP(項目=> マージ(item._2.toArray))。キャッシュ // 配列[ID_TYPE] ヴァルidTypes = result.flatMap(項目=> .distinct.collect item._1.keys) idTypes.foreach(項目 =>結果= result.filter(_._ 1.contains(アイテム))。keyBy(_._し1.Get(項目)に.get).groupByKey.map(項目=> マージ(item._2.toArray))。連合(結果.filter(!_._ 1.contains(アイテム)))) 結果 }
外観を達成するため、パフォーマンスは非常に良いではない、非再帰的な最適化
DEF unionDataRDD2(RDD:RDD [(MAP [バイト、文字列]、データ)]):RDD [(MAP [バイト、文字列]、データ)] = { valの結果 = rdd.keyBy(_._ 2.getId).groupByKey .MAP(項目=> マージ(item._2.toArray))キャッシュ。 // ((ID_TYPE、ID)、グループ) ヴァルidGroupRDD = result.flatMap(項目=> {ヴァルUUID = generateUUID; item._1.toArray。マップ(エントリ=> (エントリー、UUID))})。キャッシュ // 配列(配列(群)) ヴァルunionMap = idGroupRDD.groupByKey.map(_._ 2.toArray.distinct).filter(_。長さ> 1 ) .collect //マップ(群- > union_group) .foldLeft(MAP [文字列、文字列]())((resultUnion、ARR) => { ヴァルexistingGroupMap = arr.collect({ケース群:文字列であれば resultUnion.contains(群)=> (群、resultUnion.get(群)に.get)})。toMap 場合(existingGroupMap == NULL || existingGroupMap.isEmpty)resultUnion ++ arr.collect({ケース群:文字列=>(グループ- > arr.head)})toMap。 そう であれば(existingGroupMap.size == 1)resultUnion ++ arr.collect({ケース群:文字列=>(グループ- > existingGroupMap.head._2)})toMap。 他{ ヴァルnewUnionMap = existingGroupMap.map(_._ 2).collect({ケース群:文字列=>(グループ- > existingGroupMap.head._2)}。)toMap resultUnion.collect({ケースエントリ:(文字列、文字列)=> もし(newUnionMap.contains(entry._2))(entry._1、newUnionMap.get(entry._2)に.get)他のエントリ})++ arr.collect({ケース群:文字列=>(グループ- > newUnionMap .head._2)})。toMap } })
オーバー