У меня есть недельный процесс, который выполняет полную операцию замены на нескольких таблицах. Этот процесс является еженедельным, поскольку в целом имеется большое количество данных. Тем не менее, мы также хотим делать ежедневные/ежечасные дельта-обновления, поэтому система будет больше синхронизироваться с производством.Устранение таблицы при сохранении структур записи
Когда мы обновляем данные, мы создаем дубликаты строк (обновления существующей строки), от которых я хочу избавиться. Для достижения этой цели, я написал сценарий питона, который запускает следующий запрос на таблицу, вставив результаты обратно в него:
QUERY = """#standardSQL
select {fields}
from (
select *
, max(record_insert_time) over (partition by id) as max_record_insert_time
from {client_name}_{environment}.{table} as a
)
where 1=1
and record_insert_time = max_record_insert_time"""
Переменная {fields}
заменяется списком всех столбцов таблицы; Я не могу использовать *
, потому что это будет работать только для 1-го запуска (следующее будет уже иметь поле под названием max_record_insert_time
, и это вызовет проблему двусмысленности).
Все работает должным образом, за одним исключением - некоторые из столбцов в таблице: RECORD
Тип данных; несмотря на то, что они не используют для них псевдонимы и выбирают их полное имя (например, record_name.child_name
), когда вывод записывается обратно в таблицу, результаты сглаживаются. Я добавил конфигурацию flattenResults: False
в свой код, но это не изменило результат.
Мне бы хотелось услышать мысли о том, как решить эту проблему, используя мой существующий план, другие методы дедупликации или другие методы обработки дельта-обновлений в целом.
Holy moly! Это уникальная функция BQ? Никогда не встречал этот синтаксис раньше! Также не смотрите в документации. –
Вы можете прочитать об этом ['Синтаксис запроса] (https://cloud.google.com/bigquery/docs/reference/standard-sql/query-syntax#select-except). –