2017-09-08 18 views
3

スパナがGoogle Spanner - どのようにデータを別のテーブルにコピーしますか?

などのDDL機能を持っていないのでDESTに挿入(SOURCE_TABLEから選択*)として

どのように我々は、テーブルのサブセットを選択し、別のテーブルに行ことをコピーしていますか?

私はテンポラリテーブルにデータを書き込んだり、1日の終わりにデータをアーカイブテーブルに移動しようとしています。しかし、私が今見つけた解決策は、ソーステーブルから行を選択し、それらを新しいテーブルに書き込むことだけです。これはJava APIを使用して行われ、それはResultSetからMutationへの変換がないため、テーブルのすべての列を新しい表にマップする必要があります。行うための方法はありませんように


もう一つは、ただ1つの列のデータを更新している「更新table_nameのセット列=列-1」再び

私はその行とマップを読み取る必要がある、ということを行うに突然変異を更新するすべてのフィールドが、多くのテーブルを持っている場合、これは役に立ちません。それらのすべてをコード化する必要があります。ResultSet - >突然変異も変換されます。

一般的な突然変異クローナや、テーブル間でデータをコピーする方法はありますか?

+0

は、トランザクションあたり20000変異の限界があります。私は20列のテーブルを持っていて、それを別のテーブルにコピーしたいと思っている場合、このケースでは無駄なトランザクションシナリオにつながる、1つのトランザクションで1000行しかコピーできません(少なくとも10k行あります1日の終わりにコピーするキーごとに)。 https://cloud.google.com/spanner/docs/limits – halil

+0

Apache Beamコネクタをビルドしているため、Cloud Dataflowで大規模なバッチ処理を実行することができます。 https:// issuesのステータスに従うことができます。apache.org/jira/browse/BEAM-1542 –

答えて

2

バージョン0.15からthis open source JDBC Driverは、あるテーブルから別のテーブルにデータをコピーするために使用できるバルクINSERTステートメントをサポートしています。 INSERT構文は、データの一括更新を実行するためにも使用できます。

一括挿入例:

INSERT INTO TABLE 
(COL1, COL2, COL3) 
SELECT C1, C2, C3 
FROM OTHER_TABLE 
WHERE C1>1000 

一括更新がON DUPLICATE KEY UPDATEを添加したINSERTステートメントを使用して行われます。あなたは「力」に順に順番に既存の行が更新されるようになりますキー違反をあなたのINSERT文で主キーの値を含める必要があります:

INSERT INTO TABLE 
(COL1, COL2, COL3) 
SELECT COL1, COL2+1, COL3+COL2 
FROM TABLE 
WHERE COL2<1000 
ON DUPLICATE KEY UPDATE 

あなたがしてJDBCドライバを使用することができますたとえば、SQuirreLを使用してテストしたり、アドホックなデータ操作を行うことができます。

Cloud Spannerの根本的な制限が適用されます。つまり、1回のトランザクションで最大20,000の突然変異を意味します。 JDBCドライバは、接続文字列または接続プロパティに値AllowExtendedMode=trueを指定することで、この制限を回避できます。このモードが許可され、1つのトランザクションの制限を超える一括INSERT文またはUPDATE文を発行すると、ドライバは自動的に余分な接続を開き、新しい接続のバッチで一括操作を実行します。つまり、一括操作はアトミックに実行されず、成功したバッチごとに自動的にコミットされますが、少なくとも自動的に実行されます。

は、いくつかのより多くの例については、こちらを見てください:http://www.googlecloudspanner.com/2018/02/data-manipulation-language-with-google.html

+0

ドライバのリンクと説明をありがとうございました。 テーブル間でデータを移動するために、java apiで同様のことを実装しました。 – halil

関連する問題