Скопируйте таблицу транзакций Hadoop в снежинку
В настоящее время мы используем Hadoop и Snowflake для хранения наших данных.
Процесс - Скопировать файлы Hadoop ORC в папку Snowflake s3, используя DISTCP, а затем запустить таблицу Копировать в Snowflake из S3. Это скопирует все, что есть в таблице Hadoop ORC, в таблицу Snowflake.
Теперь у меня есть новое требование, в котором моя таблица Hadoop является транзакционной таблицей, а существующие записи обновляются каждый час. Если я копирую файлы ORC на S3 и запускаю команду "Копировать", он добавляет дополнительные записи в существующую таблицу, а не обновляет существующие 1.
Как я могу решить эту проблему в Snowflake?
1 ответ
Обычно три стратегии используются для чего-то вроде этого:
- периодически перезагружайте все - в зависимости от вашего объема данных, это может быть возможно и быстро (известно, что Snowflake может загружать несколько ТБ в час). Вы можете использовать комбо из
CREATE TABLE LIKE
,COPY
а такжеSWAP
сделать это транзакционно. - идентифицировать и экспортировать только новые строки - не знаю, какой у вас источник данных, но вы можете это сделать
- при загрузке в Snowflake не вставляйте существующие строки. У вас должен быть какой-то способ определить, какие строки одинаковы, например, поле идентификатора (или комбинация полей). Тогда ты можешь
COPY
во временную таблицу, а затем использоватьMERGE
объединить новые / измененные строки (см. документацию для различных возможных вариантов)
Немного поздно, но одно из возможных и более точных решений:
- Создайте таблицу переходных процессов на лету и скопируйте почасовые данные переходов в эти таблицы переходных процессов.
- Объединить в итоговую таблицу: из таблицы переходных процессов, созданной на шаге 1, ОБЪЕДИНИТЬСЯ в итоговую таблицу на основе вашего ПК.
Это типичный случай сохранения таблиц снимков и таблиц журнала. Чтобы избежать шага 1 вручную, вы также можете воспользоваться SNOWPIPE.
В таких случаях используйте команду Snowflake MERGE для обновления / вставки строк в целевую таблицу. В дополнение к этому вы можете изучить Snowflake CDC, чтобы загружать только дельту изменений между предыдущим и текущим моментом: https://docs.snowflake.net/manuals/user-guide/streams.html