[オリジナル]おじさんケーススタディ(5)IDは介して取得します

多くの場合、経由などで取得するには、ユーザ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 
      } 
    })

オーバー

 

おすすめ

転載: www.cnblogs.com/barneywill/p/10987452.html