hene

hene.dev

(Last updated on )

BigQuery ストリーミングバッファに関連する UPDATE/DELETE エラーの対応方法

BigQuery ストリーミングバッファに関連する UPDATE/DELETE エラーの対応方法

BigQuery でストリーミングバッファに書き込まれたデータを UPDATEDELETE しようとすると、特定のエラーが発生することがあります。 本記事では、そのエラーの原因と対応方法を解説します。

発生したエラー

ストリーミングバッファに存在するデータに対して UPDATEDELETE を実行しようとした際に、以下のエラーが発生しました。

UPDATE or DELETE statement over table <project_id>.<dataset_id>.<table_id> would affect rows in the streaming buffer, which is not supported

エラーの原因

BigQuery のストリーミングバッファに書き込まれたデータは、最大 90 分間 DML(データ操作言語)を使用して変更することができません。

データ操作言語(DML)でデータを変換する | BigQuery | Google Cloud

tabledata.insertall ストリーミング メソッドを使用して最近書き込まれた行は、 UPDATEDELETEMERGETRUNCATE ステートメントなどのデータ操作言語(DML)を使用して変更することはできません。 最近の書き込みとは、30 分以内に行われたものを指します。 テーブル内の他のすべての行は引き続き、UPDATEDELETEMERGETRUNCATE ステートメントを使用して変更できます。 ストリーミング データがコピー オペレーションで使用可能になるまでに最大 90 分かかることがあります。

つまり、ストリーミングバッファに存在するデータは、最大 90 分間は変更できないという制約があります。

対応方法

エラーを回避するためには、ストリーミングバッファに存在しないデータを対象にする必要があります。 具体的には、現在の時刻から 95 分以上前に書き込まれたデータを対象にすることで、エラーを防ぐことができます。

以下はその条件を SQL に反映した例です。

where
  created_at < datetime_sub(current_datetime('Asia/Tokyo'), interval 95 minute)

SQL の説明

下記の条件を UPDATEDELETE 文に追加することで、ストリーミングバッファに存在するデータを除外し、エラーを回避できます。

  • current_datetime('Asia/Tokyo'): 現在の日時を取得(タイムゾーンは Asia/Tokyo
  • datetime_sub: 指定した日時から一定の時間を引く
  • interval 95 minute: 現在の時刻から 95 分前を計算
  • created_at: created_at(レコードの作成日時) が 95 分以上前のデータを対象とする

参考リンク

関連記事