Эта проблема связана с управлением транзакциями в BigQuery. Я пытаюсь вставить в несколько таблиц из своего кода. Однако, поскольку после каждого оператора существует неявная фиксация, у меня нет возможности откатиться от первой таблицы, если вставка в последующие таблицы не удалась. У меня бывают ситуации, когда таблицы функционально связаны, и нам нужно иметь данные во всех них, чтобы иметь логический смысл. Бесхозные записи в некоторых таблицах приводят к проблемам с целостностью данных. у кого-нибудь есть решение?
Управление транзакциями в Google Bigquery
Ответы (4)
Лучший способ избежать такого сценария в BigQuery — денормализованные данные.
BigQuery работает лучше всего, когда ваши данные денормализованы. Вместо сохранения реляционной схемы, такой как схема звезды или снежинки, вы можете повысить производительность, денормализовав данные и воспользовавшись преимуществами вложенных и повторяющихся полей. Вложенные и повторяющиеся поля могут поддерживать отношения без влияния на производительность сохранения реляционной (нормализованной) схемы.
Экономия памяти за счет нормализованных данных не так важна в современных системах. Увеличение затрат на хранение стоит повышения производительности за счет денормализации данных. Соединения требуют координации данных (пропускная способность связи). Денормализация локализует данные в отдельных слотах, поэтому выполнение может выполняться параллельно.
Если вам нужно сохранить отношения при денормализации данных, используйте вложенные и повторяющиеся поля вместо полного выравнивания данных. Когда реляционные данные полностью сведены, сетевое взаимодействие (перетасовка) может негативно сказаться на производительности запросов.
Например, денормализация схемы заказов без использования вложенных и повторяющихся полей может потребовать группировки по полю вроде order_id (при наличии отношения «один ко многим»). Из-за перетасовки группировка данных менее эффективна, чем денормализация данных с использованием вложенных и повторяющихся полей.
Подробнее читайте на странице По возможности денормализуйте данные.
Это ответ, основанный на мнении, но похоже, что BigQuery не подходит для ваших целей. BQ идеально подходит для сценариев Analytics/DataScience, где важно анализировать данные «задним числом», а целостность транзакций не является требованием к продукту.
Если вы настроены на использование BQ таким образом, подумайте о том, чтобы сохранить исходную/исходную таблицу и создать записи «вставки» в новую таблицу (таблицы), а затем обработать/запросить оба источника в новую таблицу для работы. Это шаблон, который сохранит ваши транзакции, и вы сможете воссоздать/разрешить/удалить любые транзакции.
Короткий ответ: вы не можете выполнять управление транзакциями.
BigQuery — это хранилище данных, предназначенное для аналитики. Он не предназначен для использования в качестве транзакционной реляционной базы данных. Как было сказано ранее, денормализация увеличивает производительность и время обработки ваших данных.
Если вам нужна эта функция, вы можете использовать базу данных Cloud SQL (MySQL или PostgreSQL) и выполнять транзакционную нагрузку там. Затем вы можете запрашивать базу данных Cloud SQL с помощью BigQuery благодаря функции объединенных таблиц. а>. Вы можете сделать копию в BigQuery, если хотите, выполнив оператор вставки-выбора (будьте осторожны, вы ограничено 1000 операторов DML в день), всегда думайте о денормализации и производительности.
PS: Cloud SQL Сервер Microsoft SQL еще не поддерживается в качестве функции федеративных таблиц.
BigQuery поддерживает транзакции с несколькими операторами внутри скриптов. Транзакция с несколькими операторами позволяет выполнять операции изменения, такие как вставка или удаление строк, в одной или нескольких таблицах, а также атомарно фиксировать или откатывать изменения.
Использование транзакций с несколькими операторами включает:
- Выполнение мутаций DML в нескольких таблицах как одна транзакция. Таблицы могут охватывать несколько наборов данных или проектов.
- Выполнение мутаций на одной таблице в несколько этапов на основе промежуточных вычислений.
BEGIN TRANSACTION;
-- Create a temporary table that holds new arrivals from 'warehouse #1'.
CREATE TEMP TABLE tmp
AS SELECT * FROM mydataset.NewArrivals WHERE warehouse = 'warehouse #1';
-- Delete the matching records from the NewArravals table.
DELETE mydataset.NewArrivals WHERE warehouse = 'warehouse #1';
-- Merge the records from the temporary table into the Inventory table.
MERGE mydataset.Inventory AS I
USING tmp AS T
ON I.product = T.product
WHEN NOT MATCHED THEN
INSERT(product, quantity, supply_constrained)
VALUES(product, quantity, false)
WHEN MATCHED THEN
UPDATE SET quantity = I.quantity + T.quantity;
-- Drop the temporary table and commit the transaction.
DROP TABLE tmp;
COMMIT TRANSACTION;