2016-08-15 5 views
4

私は一緒に参加したい2つのテーブルを持っています。それらのうちの1つは、データの歪みが非常に悪いです。これは、大部分の作業が1つのパーティションで実行されるため、スパークジョブが並行して実行されない原因となります。Apache Sparkスキューされたデータの処理

私は、配布を増やすために私のキーを塩漬けすることを聞いて読んで、実装しようとしました。 https://www.youtube.com/watch?v=WyfHUNnMutg(12:45秒)はまさに私がやりたいことです。

ご意見やご感想をお寄せください。ありがとう!

答えて

2

はいあなたは(ランダム化を経由して)大きなテーブルの上に塩漬けキーを使用して、小さい1 /デカルトは新しい塩漬けいずれかに参加複製する必要があります。ここでは

は、提案のカップルです:

Tresataは

Pythonのスキューhttps://github.com/tresata/spark-skewjoinが参加RDDに参加スキュー: https://datarus.wordpress.com/2015/05/04/fighting-the-skew-in-spark/

tresataライブラリは次のようになります。

import com.tresata.spark.skewjoin.Dsl._ // for the implicits 

// skewjoin() method pulled in by the implicits 
rdd1.skewJoin(rdd2, defaultPartitioner(rdd1, rdd2), 
DefaultSkewReplication(1)).sortByKey(true).collect.toLis 
+0

はスキューが参加しない任意のScalaのライブラリはありますか? 提供した2番目のリンクにもあります。彼らは、最初のデータフレームのキーを取得し、それに乱数を追加しています。 2番目のデータフレームでは、キーをn回複製します.nは、最初のデータフレームに追加した乱数の範囲です。これは、第2のデータフレームが小さいときには扱いやすいと思われる。上記の質問をするのは正確かつ唯一の方法ですか? –

+0

import com.tresata.spark.skewjoin.Dsl._ RDD [(String、row)]のrddに.skewJoinメソッドが見つかりません –

+0

私は以下を実行しました: rdd1.skewJoin RDD2、defaultPartitioner(RDD1、RDD2)、DefaultSkewReplication(1))。sortByKey(真).collect.toList しかし、3輸入 輸入com.twitter.algebird.CMSHasherImplicits._ 輸入org.apache.spark.Partitionerを必要とします.defaultPartitioner import com.tresata.spark.skewjoin.Dsl._ –

関連する問題