2016-11-22 15 views
-1

MySQLデータベースからデータを取得するために、Eclipse内でScala sparkを使用しようとしています。 問題は、コードが1つのSQLクエリを実行するのに数時間かかることです。 これは私の最初のコードです:spark scalaでmysqlクエリを高速に実行する方法

val conf = new SparkConf().setAppName("MyApp").setMaster("local") 
val sc = new SparkContext(conf) 
val sqlcontext = new org.apache.spark.sql.SQLContext(sc) 
sqlcontext.setConf("url", "mysql://localhost:3306/myDB?user=us&password=pw") 

val action = sqlcontext.jdbc(jdbcUrl, "action").registerTempTable("action") 
val session = sqlcontext.jdbc(jdbcUrl, "session").registerTempTable("session") 
sqlcontext.cacheTable("action") 
sqlcontext.cacheTable("session") 

は、その後、私は多くのコマンド

​​

をしようとしたデータベースからデータを取得するために、これが行われるために多くの時間を要するので、私はテーブルを取得するジュストを試してみました:

val df = sqlcontext.table("action").collect() 
println(df.size) 

しかし、これは私の問題を解決しませんでした。最後に、私のアクションテーブルには約11百万行が含まれていると言います。

+0

action.session_idとsession.session_idにインデックスを追加して、パフォーマンスが向上するかどうかをお知らせください。 – radumanolescu

+0

実行しようとしている正確なクエリは何ですか? –

+1

あなたの質問に 'action'と' session'テーブルの両方のスキーマを含めるべきです。彼らのデータ構造と既存のインデックスを知ることは、他の人が最適化のための領域を特定するのに役立ちます。 –

答えて

1

長時間実行されるジョブには複数の理由があります。あなたのマスターは "ローカル"であると述べたので、あなたは単一のエグゼキュータスレッドで実行しています。 Sparkは分割された方が良いでしょう。あなたのケースで作成されたパーティションの数を確認してください。それが1の場合は、パーティション分割(numberofpartitions:int)を使用して再パーティションを行い、並列処理(local [8]/local [*])を達成するためにさらにスレッドを実行してください。

+0

あなたは正しいです、私はスパークが地元ではるかに遅いことを知っていますが、テーブルをロードするのに数時間かかることはないと思います。私はsqlcontext.table行を次のように置き換えました。 val v = sqlcontext.jdbc(jdbcUrl、 "session"、 "date_created"、chanStartDate、System.currentTimeMillis()、200) ここで、200はパーティションの数です。ローカル版のテーブルを入手するのに数分かかりますが、それはサーバー上でもうまくいくと思います。 ありがとうございます。 – tammuz

関連する問題