Как получить список имен файлов с внешнего этапа S3 Snowflake? - PullRequest
1 голос
/ 16 апреля 2020

Я ищу лучший способ автоматического обнаружения новых файлов в корзине S3, а затем загрузки данных в таблицу Snowflake.

Я знаю, что этого можно добиться с помощью Snowpipe и SNS, SQS уведомления установлены в AWS, но я хотел бы иметь автономное решение в Snowflake, которое можно использовать для нескольких источников данных.

Я хочу иметь таблицу, которая обновляется с именами файлов из корзины S3 а затем загрузить файлы, которые еще не были загружены из S3 в Snowflake.

Единственный найденный мной способ автоматического обнаружения новых файлов из внешнего этапа S3 в Snowflake - это использовать приведенный ниже код и задание по заданному графику. Здесь перечислены имена файлов, а затем используется result_scan для отображения последнего запроса в виде таблицы.

list @STAGE_NAME;
set qid=last_query_id();
select "name" from table(result_scan($qid))

Кто-нибудь знает лучший способ автоматического обнаружения новых файлов на внешнем этапе из Snowflake? Любая помощь очень ценится.

Ответы [ 2 ]

0 голосов
/ 17 апреля 2020

Краткий прогон:

Ваш подход

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

Другой подход

Альтернативой, если вам не нравится подход, который вы используете, было бы создание одной таблицы с одним столбцом данных VARIANT плюс поддерживаемые столбцы метаданных этапа. по одной гигантской трубе, и вы можете поддерживать набор материализованных представлений над этой таблицей, которые будут фильтровать, преобразовывать варианты полей в столбцы и очищать, в зависимости от ситуации.

Существуют некоторые преимущества:

  • проще: интеграция новых префиксов для этапа требует только дополнительного материализованного представления, а не дополнительной трубы + задача
  • больше контроля: вы сможете напрямую и автоматически работать с данными в необработанном виде, а не загружать их в таблицу и проверять ее. Это означает, что вы можете выполнять проверки качества данных, метаданных и очистки.
  • ремонтопригоден: использование материализованных представлений над неизменным источником означает, что вы можете в любое время изменить логи c и выполнить полную обратную засыпку без особых усилий.

Long Run:

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

0 голосов
/ 17 апреля 2020

Не обязательно лучше, чем вы уже нашли, но есть альтернативный подход к перечислению файлов в корзине S3.

Если вы создаете ВНЕШНЮЮ СТОЛУ поверх данные в S3, вы можете использовать в запросе свойство METADATA $ FILENAME . Если у вас есть запись о том, какие файлы уже были загружены в Snowflake, вы можете сравнить и выбрать имена новых файлов и обработать их.

например

ALTER EXTERNAL TABLE MYSCHEMA.MYEXTERNALTABLE REFRESH;

SELECT DISTINCT
   METADATA$FILENAME as filename
FROM 
   MYSCHEMA.MYEXTERNALTABLE;
...