Обновить или удалить таблицы с потоковым буфером в BigQuery?

Я получаю следующую ошибку при попытке удалить записи из таблицы, созданной с помощью консоли GCP и обновленной с помощью функции вставки таблицы 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.

Означает ли это, что после того, как запись была вставлена с этой функцией в таблицу, нет способа удалить записи? Вообще? Если это так, значит ли это, что таблицу необходимо удалить и создать заново? Если это не так. Не могли бы вы предложить обходной путь, чтобы избежать этой проблемы?

Спасибо!


Включая новое сообщение об ошибке для SEO: "Оператор UPDATE или DELETE над таблицей... повлияет на строки в потоковом буфере, что не поддерживается" - Fh

Ответ 1

Чтобы проверить, есть ли в таблице потоковый буфер, проверьте ответ tables.get для раздела с именем streamingBuffer или, при потоковой передаче в секционированную таблицу, данные в потоковом буфере имеют значение NULL для псевдостолбца _PARTITIONTIME, поэтому даже с простым запросом WHERE можно проверить.

Потоковые данные доступны для анализа в режиме реального времени в течение нескольких секунд после первой потоковой вставки в таблицу, но может потребоваться до 90 минут, чтобы стать доступным для копирования/экспорта и других операций. Вероятно, вам придется подождать до 90 минут, чтобы весь буфер был сохранен в кластере. Вы можете использовать запросы, чтобы проверить, пуст ли потоковый буфер или нет, как вы упомянули.

Если для создания таблицы вы используете загрузку, у вас не будет потокового буфера, но, возможно, вы перенаправили в него некоторые значения.


Обратите внимание на ответ ниже, чтобы работать с таблицами, которые имеют текущие потоковые буферы. Просто используйте WHERE, чтобы отфильтровать последние минуты данных, и ваши запросы будут работать. - Fh

Ответ 2

Обязательно измените фильтры, чтобы они не включали данные, которые могут находиться в текущем буфере потоковой передачи.

Например, этот запрос не выполняется во время потоковой передачи в эту таблицу:

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.