web-dev-qa-db-ja.com

BigQueryのストリーミングバッファーでテーブルを更新または削除しますか?

GCP Consoleで作成され、GCP BigQuery Node.jsテーブル挿入関数で更新されたテーブルからレコードを削除しようとすると、次のエラーが発生します。

_UPDATE or DELETE DML statements are not supported over table stackdriver-360-150317:my_dataset.users with streaming buffer_

テーブルは、ストリーミング機能なしで作成されました。そして、私がドキュメントで読んでいるものから Tables that have been written to recently via BigQuery Streaming (tabledata.insertall) cannot be modified using UPDATE or DELETE statements

この関数を使用してレコードがテーブルに挿入されると、レコードを削除する方法がないということですか?まったく?その場合、テーブルを削除して最初から再作成する必要があるということですか?そうでない場合。この問題を回避するための回避策を提案できますか?

ありがとう!

20
Diego

テーブルにストリーミングバッファがあるかどうかを確認するには、tables.getstreamingBufferという名前のセクションの応答、またはパーティションテーブルにストリーミングする場合、ストリーミングバッファ内のデータには_PARTITIONTIME疑似列。したがって、単純なWHEREクエリでもチェックできます。

ストリーミングデータ は、テーブルへの最初のストリーミング挿入から数秒以内にリアルタイム分析に使用できますが、コピー/エクスポートおよびその他の操作に使用できるようになるまで最大90分かかる場合があります。すべてのバッファーがクラスターに保持されるように、おそらく最大90分待機する必要があります。クエリを使用して、ストリーミングバッファが空かどうかを確認できます。

ロードジョブを使用してテーブルを作成する場合、ストリーミングバッファーはありませんが、おそらくいくつかの値をストリームしました。

22
Pentium10

フィルターを変更して、現在のストリーミングバッファーに含まれる可能性のあるデータが含まれないようにしてください。

たとえば、このテーブルにストリーミングしているときにこのクエリは失敗します。

DELETE FROM `project.dataset.table` 
WHERE id LIKE '%-%'

Error: UPDATE or DELETE statement over table project.dataset.table would affect rows in the streaming buffer, which is not supported

古いレコードを削除するだけで修正できます:

DELETE FROM `project.dataset.table` 
WHERE id LIKE '%-%'
AND ts < TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 40 MINUTE)

4282 rows affected.
5
Felipe Hoffa