Обновить или удалить таблицы с потоковым буфером в 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.