spark中演算子詳細解:combineByKey
1337 ワード
combineByKeyはsparkの中でもっと下層で、もっと理解しにくいが、もっと柔軟な演算子である.
この演算子は3つの関数を入力する必要がある.
1番目の関数は、各パーティションの1番目の値を操作する2番目の関数で、各パーティションに対して3番目の関数を操作し、2番目の関数が各パーティションに対して結果を生成した後、すべてのパーティションの結果を集約します.
次に具体例を示します
scala集合によるrddの生成
上記のx=>x+10は第1の関数(a:Int,b:Int)=>a+bは第2の関数(m:Int,n:Int)=>m+nは第3の関数である
この例では、データは2つのパーティションに配置され、
最初のパーティションのデータは(1,2,3,4)
2番目のパーティションのデータは(5,6,7,8)
最初のパーティションでは、最初の関数は1を取り出し、10を加えて結果11を2番目の関数に伝えます.
(a:Int,b:Int)=>a+bが2番目の関数である場合、aは1番目の関数から送られてきた11を受信し、このパーティションの1の後ろの要素、すなわち2をbに割り当て、2つを加算した後、結果13をaに与えて上の操作を繰り返し、このパーティションの最後の要素が加算されるまで、このパーティション内のすべてのデータが別のパーティションに追加されたのも同様の操作フローであり,2つのパーティションの操作が同時に行われる.各パーティションが操作された後、計算結果を3番目の関数に渡します.3番目の関数には、多くのパーティションがある可能性があるため、2番目の関数から送られてきたデータを保存するために、配列のようなデータ構造があるはずです.今は2人しかいません.
(m:Int,n:Int)=>m+nは3番目の関数この関数がメンテナンスしている類似配列のデータ構造の中から、1番目のデータを取り出し、mに与え、2番目のデータを取り出し、nに与えてmとnを加算した結果を与え、mに与えて3番目のデータを取り出し、nに与えて実行上の操作を繰り返してグローバル加算機能を完成させる.
この演算子は3つの関数を入力する必要がある.
1番目の関数は、各パーティションの1番目の値を操作する2番目の関数で、各パーティションに対して3番目の関数を操作し、2番目の関数が各パーティションに対して結果を生成した後、すべてのパーティションの結果を集約します.
次に具体例を示します
scala集合によるrddの生成
scala > val rdd1 = sc.parallelize(List(1,2,3,4,5,6,7,8),2)
scala > val rdd2 = rdd1.combineByKey(x => x+10,(a:Int,b:Int) => a+b,(m:Int,n:Int) => m+n)
上記のx=>x+10は第1の関数(a:Int,b:Int)=>a+bは第2の関数(m:Int,n:Int)=>m+nは第3の関数である
この例では、データは2つのパーティションに配置され、
最初のパーティションのデータは(1,2,3,4)
2番目のパーティションのデータは(5,6,7,8)
最初のパーティションでは、最初の関数は1を取り出し、10を加えて結果11を2番目の関数に伝えます.
(a:Int,b:Int)=>a+bが2番目の関数である場合、aは1番目の関数から送られてきた11を受信し、このパーティションの1の後ろの要素、すなわち2をbに割り当て、2つを加算した後、結果13をaに与えて上の操作を繰り返し、このパーティションの最後の要素が加算されるまで、このパーティション内のすべてのデータが別のパーティションに追加されたのも同様の操作フローであり,2つのパーティションの操作が同時に行われる.各パーティションが操作された後、計算結果を3番目の関数に渡します.3番目の関数には、多くのパーティションがある可能性があるため、2番目の関数から送られてきたデータを保存するために、配列のようなデータ構造があるはずです.今は2人しかいません.
(m:Int,n:Int)=>m+nは3番目の関数この関数がメンテナンスしている類似配列のデータ構造の中から、1番目のデータを取り出し、mに与え、2番目のデータを取り出し、nに与えてmとnを加算した結果を与え、mに与えて3番目のデータを取り出し、nに与えて実行上の操作を繰り返してグローバル加算機能を完成させる.