概要
BigQueryは、大規模なデータセットの分析に使用されるクラウドベースのデータウェアハウスです。
ストリーミングデータの処理に優れており、ストリーミングインサート機能を提供しています。
しかし、このストリーミングインサート機能には、UPDATEまたはDELETEステートメントを実行する際に生じる問題があります。
結論
およそ数秒〜数十分ほどの間、UPDATEまたはDELETEステートメントを実行することができません。
理由はストリーミングインサート機能では、すぐにテーブルにデータが書き込まれるわけではないからです。
まずストリーミングバッファに保留されて、その後データがテーブルに永続的に書き込まれます。
ストリーミングバッファに保留されている間は、データの変更と削除ができません。
UPDATEまたはDELETEステートメントがストリーミングバッファに存在するデータに影響を与えることができないため、
エラーメッセージが発生します。
解決策
この問題を解決するには、以下の2つの方法があります。
データがテーブルに書き込まれるのを待つ
純粋にデータが書き込まれるのを待ちましょう。
安全にデータを管理するためにストリーミングバッファ機能を選択したのであれば、待つのが最善です。
ストリーミングバッファを無効する
ストリーミングバッファは無効にすることができます。
ストリーミングバッファを無効にすることで、ストリーミングインサートされたデータは直ちにテーブルに書き込まれ、
UPDATEまたはDELETEステートメントを実行することができます。
ストリーミングバッファを無効にする手順は以下の通りです。
- BigQueryコンソールで、対象のテーブルを選択します。
- 「編集」をクリックして、テーブルの設定画面を開きます。
- 「設定」タブを選択し、「ストリーム設定」セクションに移動します。
- 「バッファリングの設定」をクリックします。
- 「バッファリングを有効にする」チェックボックスをオフにします。
- 「変更を保存」をクリックして設定を保存します。
以上の手順で、ストリーミングバッファを無効にすることができます。
無効化のデメリット
ストリーミングバッファを無効にすることにより、エラーは解消されます。
ただ、これによりストリーミングインサートのパフォーマンスが低下する可能性があるため、慎重に検討する必要があります。
また、ストリーミングバッファを無効にする場合は、
ストリーミングインサートのデータがすぐにテーブルに書き込まれるため、クエリのパフォーマンスが低下する可能性があります。
これを防ぐために、ストリーミングバッファを有効にしたまま、ストリーミングインサートを定期的にバッチ処理することもできます。
ストリーミングバッファの影響を受けることなく、データをテーブルに挿入することができます。
まとめ
BigQueryのストリーミングインサート機能を使用してデータを挿入する際に、
UPDATEまたはDELETEステートメントを実行する際に生じる問題を解決するためには、
ストリーミングバッファに保留されているデータがデータベースに書き込まれるのを待つか、
ストリーミングバッファを無効にする方法があります。
ただし、ストリーミングバッファを無効にすると、ストリーミングインサートのパフォーマンスが低下する可能性があるため、
リスクを踏まえて慎重に検討しましょう。