Фабрика данных Azure: имя файла выходного набора данных из имени папки входного набора данных

#azure #azure-data-factory #azure-data-factory-2

#azure #azure-data-factory #azure-data-factory-2

Вопрос:

Я пытаюсь решить следующий сценарий на фабрике данных Azure:

У меня большое количество папок в хранилище больших двоичных объектов Azure. Каждая папка содержит разное количество файлов в формате parquet. Имя папки содержит дату создания данных, содержащихся в папке, примерно так: ДАТА = 2021-01-01. Мне нужно отфильтровать файлы и сохранить их в другой контейнер в формате с разделителями, и у каждого файла должна быть дата, указанная в имени исходной папки в имени файла.

Итак, когда мой ввод выглядит примерно так…

 DATE=2021-01-01/
    data-file-001.parquet
    data-file-002.parquet
    data-file-003.parquet
DATE=2021-01-02/
    data-file-001.parquet
    data-file-002.parquet
 

… мой вывод должен выглядеть примерно так:

 output-data/
    data_2021-01-01_1.csv
    data_2021-01-01_2.csv
    data_2021-01-01_3.csv
    data_2021-01-02_1.csv
    data_2021-01-02_2.csv
 

Легко считывать файлы из вложенных папок, фильтровать их и сохранять. Проблемы начинаются, когда я пытаюсь динамически задать имя файла выходного набора данных. Я могу получить имена папок, используя действие Get Metadata, а затем я могу использовать действие ForEach для их преобразования в переменные. Однако я не могу понять, как использовать эту переменную при фильтрации набора данных приемников потока данных.

Ответ №1:

Обновить:
В моей операции Get Metadata1 установите контейнер input следующим образом:
введите описание изображения здесь Установите контейнер input следующим образом:
введите описание изображения здесь моя отладочная информация выглядит следующим образом: введите описание изображения здесь

Я думаю, что нашел решение. Например, я использую файлы csv.
Мой ввод выглядит примерно так

 container:input 
    2021-01-01/
      data-file-001.csv
      data-file-002.csv
      data-file-003.csv
    2021-01-02/
      data-file-001.csv
      data-file-002.csv
 

Мой результат отладки выглядит следующим образом:
введите описание изображения здесь

введите описание изображения здесь

  1. Использование Get Metadata1 activity для получения списка папок, а затем использование ForEach1 activity для итерации этого списка.
    введите описание изображения здесь
  2. Внутри ForEach1 действия мы теперь используем поток данных для перемещения данных.
    введите описание изображения здесь
  3. Установите исходный набор данных в контейнер и объявите параметр FolderName . введите описание изображения здесь
  4. Затем добавьте динамическое содержимое @dataset().FolderName в исходный источник данных. введите описание изображения здесь
  5. Возвращаясь к ForEach1 действию, мы можем добавить динамическое содержимое @item().name в параметр FolderName . введите описание изображения здесь
  6. Введите File_Name вкладку. Он сохранит имя файла в виде столбца, например. /2021-01-01/data-file-001.csv . введите описание изображения здесь
  7. Затем мы можем обработать этот столбец, чтобы получить нужное имя файла DerivedColumn1 . Выражение concat('data_',substring(File_Name,2,10),'_',split(File_Name,'-')[5]) Addd . введите описание изображения здесь
  8. В настройках приемника мы можем выбрать Name file as column data и File_Name . введите описание изображения здесь

Вот и все.

Комментарии:

1. Я повторил ваше предложение, но у меня все еще возникают проблемы. Я не уверен, использую ли я другую версию или что-то в этом роде, но при добавлении параметра FolderName мне также нужно определить значение по умолчанию. Если я оставлю это поле пустым, я получаю сообщение об ошибке при запуске отладки. Если я установлю начальное значение для первой папки, содержащей файлы, операция Get Metadata получит имена файлов из этой папки вместо списка папок.

2. Привет, потому что значение параметра FolderName получается динамически. Раньше я устанавливал «2021-01-01» в качестве значения по умолчанию для предварительного просмотра потока данных. Затем я удалил его.