#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
Мой результат отладки выглядит следующим образом:
- Использование
Get Metadata1
activity для получения списка папок, а затем использованиеForEach1
activity для итерации этого списка.
- Внутри
ForEach1
действия мы теперь используем поток данных для перемещения данных.
- Установите исходный набор данных в контейнер и объявите параметр
FolderName
. - Затем добавьте динамическое содержимое
@dataset().FolderName
в исходный источник данных. - Возвращаясь к
ForEach1
действию, мы можем добавить динамическое содержимое@item().name
в параметрFolderName
. - Введите
File_Name
вкладку. Он сохранит имя файла в виде столбца, например./2021-01-01/data-file-001.csv
. - Затем мы можем обработать этот столбец, чтобы получить нужное имя файла
DerivedColumn1
. Выражениеconcat('data_',substring(File_Name,2,10),'_',split(File_Name,'-')[5])
Addd . - В настройках приемника мы можем выбрать
Name file as column data
иFile_Name
.
Вот и все.
Комментарии:
1. Я повторил ваше предложение, но у меня все еще возникают проблемы. Я не уверен, использую ли я другую версию или что-то в этом роде, но при добавлении параметра FolderName мне также нужно определить значение по умолчанию. Если я оставлю это поле пустым, я получаю сообщение об ошибке при запуске отладки. Если я установлю начальное значение для первой папки, содержащей файлы, операция Get Metadata получит имена файлов из этой папки вместо списка папок.
2. Привет, потому что значение параметра FolderName получается динамически. Раньше я устанавливал «2021-01-01» в качестве значения по умолчанию для предварительного просмотра потока данных. Затем я удалил его.