2017-01-26 10 views
2

変更されたデータを挿入しないで、私は以下のようにIDと名前とMySQLでtestテーブルがあります。スパークSQLとはmysql- SaveMode.Overwrite

+----+-------+ 
| id | name | 
+----+-------+ 
| 1 | Name1 | 
+----+-------+ 
| 2 | Name2 | 
+----+-------+ 
| 3 | Name3 | 
+----+-------+ 

を私は(JDBCを使用して)、このデータを読み取るためにスパークDataFrameを使用していますし、この

Dataset<Row> modified = sparkSession.sql("select id, concat(name,' - new') as name from test"); 
modified.write().mode("overwrite").jdbc(AppProperties.MYSQL_CONNECTION_URL, 
       "test", connectionProperties); 

のようにデータを変更しかし、私の問題は、私は、上書きモードを与えれば、それは前の表をドロップし、新しいテーブルを作成しますが、任意のデータを挿入していない、です。

私は同じプログラムをcsvファイル(テストテーブルと同じデータ)から読み込んで上書きしてみました。それは私のために働いた。

ここに何か不足していますか?

ありがとうございました!

答えて

4

問題はあなたのコードにあります。読んでいるテーブルを上書きするので、Sparkが実際にアクセスする前にすべてのデータを効果的に消去します。

スパークは怠惰であることに注意してください。 Datasetを作成すると、Sparkは必要なメタデータをフェッチしますが、データはロードされません。したがって、元のコンテンツを保存するマジックキャッシュはありません。実際に必要なときにデータが読み込まれます。ここでは、writeアクションを実行し、書き込みを開始するときにフェッチするデータがなくなります。あなたが必要なもの

は次のようなものです:

  • Datasetを作成します。
  • 必要な変換を適用し、中間テーブルにデータを書き込みます。
  • TRUNCATE元入力とINSERT INTO ... SELECT中間テーブルまたはDROP元テーブルとRENAME中間テーブル。
関連する問題