Управление транзакциями в Google Bigquery

Эта проблема связана с управлением транзакциями в BigQuery. Я пытаюсь вставить в несколько таблиц из своего кода. Однако, поскольку после каждого оператора существует неявная фиксация, у меня нет возможности откатиться от первой таблицы, если вставка в последующие таблицы не удалась. У меня бывают ситуации, когда таблицы функционально связаны, и нам нужно иметь данные во всех них, чтобы иметь логический смысл. Бесхозные записи в некоторых таблицах приводят к проблемам с целостностью данных. у кого-нибудь есть решение?


person Lovell Mathews    schedule 03.12.2019    source источник


Ответы (4)


Лучший способ избежать такого сценария в BigQuery — денормализованные данные.

BigQuery работает лучше всего, когда ваши данные денормализованы. Вместо сохранения реляционной схемы, такой как схема звезды или снежинки, вы можете повысить производительность, денормализовав данные и воспользовавшись преимуществами вложенных и повторяющихся полей. Вложенные и повторяющиеся поля могут поддерживать отношения без влияния на производительность сохранения реляционной (нормализованной) схемы.

Экономия памяти за счет нормализованных данных не так важна в современных системах. Увеличение затрат на хранение стоит повышения производительности за счет денормализации данных. Соединения требуют координации данных (пропускная способность связи). Денормализация локализует данные в отдельных слотах, поэтому выполнение может выполняться параллельно.

Если вам нужно сохранить отношения при денормализации данных, используйте вложенные и повторяющиеся поля вместо полного выравнивания данных. Когда реляционные данные полностью сведены, сетевое взаимодействие (перетасовка) может негативно сказаться на производительности запросов.

Например, денормализация схемы заказов без использования вложенных и повторяющихся полей может потребовать группировки по полю вроде order_id (при наличии отношения «один ко многим»). Из-за перетасовки группировка данных менее эффективна, чем денормализация данных с использованием вложенных и повторяющихся полей.

Подробнее читайте на странице По возможности денормализуйте данные.

person Mikhail Berlyant    schedule 03.12.2019
comment
Спасибо, я понял смысл денормализации данных. Позвольте мне взглянуть на это. - person Lovell Mathews; 04.12.2019

Это ответ, основанный на мнении, но похоже, что BigQuery не подходит для ваших целей. BQ идеально подходит для сценариев Analytics/DataScience, где важно анализировать данные «задним числом», а целостность транзакций не является требованием к продукту.

Если вы настроены на использование BQ таким образом, подумайте о том, чтобы сохранить исходную/исходную таблицу и создать записи «вставки» в новую таблицу (таблицы), а затем обработать/запросить оба источника в новую таблицу для работы. Это шаблон, который сохранит ваши транзакции, и вы сможете воссоздать/разрешить/удалить любые транзакции.

person rtenha    schedule 03.12.2019
comment
Спасибо, мне нравится 2-й вариант, хотя это может быть немного дорого. По вашему мнению о самой базе данных, вы бы порекомендовали вообще альтернативную БД? И если да, то что это будет? Мое требование высокого уровня - иметь возможность получать данные в формате csv (структура точно не известна, но большие объемы). Затем я бы обработал его, используя некоторую вычислительную логику (сама логика может быть в java или python), а затем сохранил бы вывод обратно. Затем мне нужно будет сообщить о сохраненных результатах. - person Lovell Mathews; 04.12.2019

Короткий ответ: вы не можете выполнять управление транзакциями.

BigQuery — это хранилище данных, предназначенное для аналитики. Он не предназначен для использования в качестве транзакционной реляционной базы данных. Как было сказано ранее, денормализация увеличивает производительность и время обработки ваших данных.

Если вам нужна эта функция, вы можете использовать базу данных Cloud SQL (MySQL или PostgreSQL) и выполнять транзакционную нагрузку там. Затем вы можете запрашивать базу данных Cloud SQL с помощью BigQuery благодаря функции объединенных таблиц. . Вы можете сделать копию в BigQuery, если хотите, выполнив оператор вставки-выбора (будьте осторожны, вы ограничено 1000 операторов DML в день), всегда думайте о денормализации и производительности.

PS: Cloud SQL Сервер Microsoft SQL еще не поддерживается в качестве функции федеративных таблиц.

person guillaume blaquiere    schedule 04.12.2019
comment
дополнительная информация: лимиты пакетной/DML не связаны с потоковой передачей (это отдельные лимиты/операции), очень важные для стратегической инфраструктуры и настройки ETL - person InLaw; 29.10.2020
comment
Все изменится !! Мой прошлогодний ответ не будет верным через 1 год!! Быть в курсе - person guillaume blaquiere; 29.10.2020

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;
person SANN3    schedule 01.07.2021