2016-09-06 3 views
0

私は4百万のレコードを持つテーブルを持っています。新しいデータは毎日更新されています。新しいデータを処理した後にテーブルを更新する必要があります。現在私はこの目的のためにこれをやっています。私はスカラを使用しています。Spark Mysqlからの高速アップデート

val batchSize = 1000 
df.rdd mapPartitions (_ grouped batchSize) foreach { batch => 
    { 
    val connection = getConnection(); 
    val statement = connection.createStatement(); 
    batch.foreach { row => 
     val query = "UPDATE temp SET file_name='" + row.get(0) + " WHERE id=" + row.get(3); 
     statement.executeUpdate(query); 

    } 
    connection.close(); 
    } 
} 

これは正確なクエリではありませんが、私はこのようにしています。これは、テーブルを更新するのに約1時間かかります。パフォーマンスを改善する必要があります。どのように私はパフォーマンスを達成することができます。

答えて

1
  1. SQLデータベースが索引付けされていない場合は、row.get(3)フィールドに従って索引を追加します。
  2. SQLデータベースがInnoDBのではない場合、それはInnoDB作る - InnoDBは(同時実行のために必要な)同時操作のためのより良いです

火花と同時に一部が正しく行われ、更なる最適化がなされるべきであるように見えます

+0

はい私はinnoDBを使用していますが、キーのインデックスも持っていますが、1秒あたりの最大更新数は6000〜7000であり、4million行のテーブルでは約11分かかります。 –

+0

@AtifShahzadさらにバッチを並列化しようとすると、どのデータ型ですか? '(1〜10000).toArray.par' –

+0

バッチデータ型はSeq [行]です。 –

関連する問題