Фабрика данных Azure с действием копирования, использующим двоичный набор данных, не может скопировать содержимое папки, если оно параметризовано

В моей фабрике данных Azure мне нужно скопировать данные из источника SFTP, который структурировал данные в каталоги на основе даты со следующей иерархией. год -> месяц -> число -> файл

Я создал связанную службу и двоичный набор данных, в котором набор данных «файловая система» указывает на хост, а «Каталог» указывает на папку, содержащую каталоги года. Пример: host/exampledir/yeardir/

с yeardir, содержащим каталоги года.

Когда я вручную пишу в набор данных, что мне нужна папка «2015», он скопирует всю папку 2015 года, однако, если я установлю параметр для каталога, а затем введу тот же путь к папке из действия копирования, он создаст файл с именем «2015» внутри моего хранилища больших двоичных объектов, которое не содержит данных.

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

Возможно ли это в рамках фабрики данных?

редактировать:

ручной путь к файлу, который работает

параметризованный путь к файлу

свойства, используемые при копировании

Чтобы добавить дополнительный контекст, я попытался вручную записать путь к файлу в действие копирования, как показано на фотографии, я также попытался использовать переменные, динамическое содержимое для параметра (используя базовый путь к файлу и concat), а также поместить базовый путь к файлу в набор данных рядом с @dataset().filePath. Ни одно из этих решений до сих пор не сработало для меня и либо ничего не копировало, либо создавало пустой файл, о котором я упоминал ранее.

Приемник — это двоичный набор данных, связанный с Azure Data Lake Storage 2-го поколения.

путь к файлу стока

Обновлять:

Принятый ответ - это решение. Моя проблема заключалась в том, что исходный набор данных при извлечении имел новую строку в конце при передаче в качестве параметра. Я использовал concat, чтобы очистить это, и с тех пор это сработало.

Можете ли вы предоставить изображения/информацию (динамический контент или параметры и их значения) конфигурации набора данных для источника и приемника?

Saideep Arikontham 09.01.2023 11:51

@SaideepArikontham Я обновил свой пост запрошенной вами информацией. Если вам нужна дополнительная информация, я обновлю сообщение по мере необходимости. заранее спасибо

Necropants 09.01.2023 12:35

Можете ли вы уточнить это: вы хотите скопировать папку каждого года, присутствующую в exampledir/yeardir/. Вручную вы только что скопировали папку за год 2015, но требуется скопировать все такие папки (с файлами) в место назначения. Это правильно или вы хотите скопировать только папку 2015?

Saideep Arikontham 09.01.2023 12:43

Я хочу перебрать каждую папку и скопировать все вложенное содержимое внутри. Так, например, каталог может содержать 2015, 2016, 2017 и т. д. до текущего года. И мы хотим разбить его по годам, чтобы переводы можно было делать самостоятельно.

Necropants 09.01.2023 13:03

Когда вы вручную указываете путь как exampledir/yeardir/2015, вы получаете желаемые результаты, верно?

Saideep Arikontham 09.01.2023 13:05

Да, он копирует папку и содержимое внутри. Проблема в том, что мы хотим параметризовать его, чтобы мы могли использовать exampledir/yeardir/@dataset().directory или просто @dataset().directory для передачи в 2015 году или exampledir/yeardir/2015 (с concat) и скопировать его как что.

Necropants 09.01.2023 13:12
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
Как установить LAMP Stack 1/2 на Azure Linux VM
Как установить LAMP Stack 1/2 на Azure Linux VM
В дополнение к нашему предыдущему сообщению о намерении Azure прекратить поддержку Azure Database для MySQL в качестве единого сервера после 16...
0
6
64
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Поскольку предоставление exampledir/yeardir/2015 отлично сработало для вас, и вы хотите скопировать все папки, присутствующие в exampledir/yeardir, вы можете выполнить следующую процедуру:

  • Я предпринял get metadata действие, чтобы получить дочерние элементы папки exampledir/yeardir/ (в моей демонстрации я выбрал путь как «maindir/yeardir».).

  • Это даст вам все папки за год. Я взял для примера только 2020 и 2021 годы.

  • Теперь, имея только один для каждого действия со значением элементов в качестве дочерних элементов, выводимых для действия получения метаданных, я напрямую использовал действие копирования.
@activity('Get Metadata1').output.childItems

  • Теперь внутри для каждого у меня есть активность копирования данных. Как для источника, так и для приемника я создал параметр набора данных для путей. Я дал следующий динамический контент для исходного пути.
maindir/yeardir/@{item().name}

  • Для приемника я указал выходной каталог следующим образом:
outputDir/@{item().name}

  • Поскольку указание пути вручную, как работало exampledir/yeardir/2015, мы получили список папок года, используя действие получения метаданных. Мы прошлись по каждому из них и скопировали каждую папку с исходным путем как exampledir/yeardir/<current_iteration_year_folder>.

  • В зависимости от того, как я указал путь к приемнику, данные будут скопированы с содержимым. Ниже приведено эталонное изображение.

Я следовал вашим инструкциям и в значительной степени пытался сделать что-то подобное раньше, но я забыл использовать @{item.name()} в приемнике. Однако это решение не работает для меня, поскольку оно по-прежнему выводит файл с одним блоком. Однако я очень ценю вашу помощь, это поставило меня в тупик, поскольку я могу воспроизвести желаемое поведение для любого из моих других наборов данных, но не конкретно для этого.

Necropants 09.01.2023 15:03

Не уверен, почему процедура работает вручную (например, каталог/год каталог/2015), но не для описанной выше процедуры. Если это не сработает, то предложенный вами обходной путь является лучшим подходом.

Saideep Arikontham 10.01.2023 13:12

Другие вопросы по теме