В моем случае я работаю с данными, которые можно идентифицировать по уникальному ключу в источнике, разбитому на n (недетерминированное) количество целевых записей, загруженных в таблицы BigQuery для аналитических целей.
Создание этого ETL для использования функции недавнего изменения потока в Mongo. Я хотел бы удалить все записи в BigQuery, а затем атомарно загрузить новые записи.
Изучение BigQuery DML Я вижу, что MERGE поддерживается, но возможна только WHEN MATCHED THEN DELETE
или WHEN MATCHED THEN UPDATE
.
Я заинтересован в , КОГДА СОПРОВОЖДАЕТСЯ ТОГО, ЧТО УДАЛИТЬ, И СЛЕДУЕТ ЗА ВСТАВКОЙ .
Как бы я внедрил такой ETL в BigQuery, оставаясь при этом атомарным или, в конечном итоге, непротиворечивым с точки зрения доступности и правильности данных.
РЕДАКТИРОВАТЬ 1: Я хотел бы привести конкретный пример для разработки.
Самая низкая степень детализации уникальности, которую я имею в этом наборе данных, составляет user_id
. Строки не являются однозначно идентифицируемыми.
Пример
1
Обновленный пользовательский объект, полученный из потока изменений Монго:
user={_id: "3", name="max", registered="2018-07-05" q=["a", "b", "c"]}
2
Текущий BigQuery.user_q содержит
| user_id | q |
...
| 3 | a |
| 3 | b |
...
3.
Преобразование кода загружает измененный объект пользователя в BigQuery.user_q_incoming
| user_id | q |
| 3 | a |
| 3 | b |
| 3 | c |
4
MERGE между user_q
и user_q_incoming
:
- 2 строки в
user_q
, принадлежащих user_id 3
, УДАЛЕНЫ
- 3 строки в
user_q_incoming
, которые принадлежат user_id 3
, вставлены.
- Остальные данные (
...
) в user_q
остаются без изменений.
5
BigQuery.user_q содержит
| user_id | q |
...
| 3 | a |
| 3 | b |
| 3 | c |
...
Например, пользователь может удалить вопрос из своего профиля. Оставляя оставшиеся строки равными q=["a", "c"]
. Мне нужно это также перевести на мировоззрение BigQuery.