В моей фабрике данных Azure мне нужно скопировать данные из источника SFTP, который структурировал данные в каталоги на основе даты со следующей иерархией. год -> месяц -> число -> файл
Я создал связанную службу и двоичный набор данных, в котором набор данных «файловая система» указывает на хост, а «Каталог» указывает на папку, содержащую каталоги года. Пример: host/exampledir/yeardir/
с yeardir, содержащим каталоги года.
Когда я вручную пишу в набор данных, что мне нужна папка «2015», он скопирует всю папку 2015 года, однако, если я установлю параметр для каталога, а затем введу тот же путь к папке из действия копирования, он создаст файл с именем «2015» внутри моего хранилища больших двоичных объектов, которое не содержит данных.
Мой текущий обходной путь состоит в том, чтобы создать вложенную последовательность циклов получения метаданных для каждой папки и подпапки и скопировать концы отдельных файлов. Однако желаемый результат состоит в том, чтобы вместо этого один набор двоичных данных копировал каждую папку без необходимости получения метаданных.
Возможно ли это в рамках фабрики данных?
редактировать:
ручной путь к файлу, который работает
параметризованный путь к файлу
свойства, используемые при копировании
Чтобы добавить дополнительный контекст, я попытался вручную записать путь к файлу в действие копирования, как показано на фотографии, я также попытался использовать переменные, динамическое содержимое для параметра (используя базовый путь к файлу и concat), а также поместить базовый путь к файлу в набор данных рядом с @dataset().filePath. Ни одно из этих решений до сих пор не сработало для меня и либо ничего не копировало, либо создавало пустой файл, о котором я упоминал ранее.
Приемник — это двоичный набор данных, связанный с Azure Data Lake Storage 2-го поколения.
Обновлять:
Принятый ответ - это решение. Моя проблема заключалась в том, что исходный набор данных при извлечении имел новую строку в конце при передаче в качестве параметра. Я использовал concat, чтобы очистить это, и с тех пор это сработало.
@SaideepArikontham Я обновил свой пост запрошенной вами информацией. Если вам нужна дополнительная информация, я обновлю сообщение по мере необходимости. заранее спасибо
Можете ли вы уточнить это: вы хотите скопировать папку каждого года, присутствующую в exampledir/yeardir/
. Вручную вы только что скопировали папку за год 2015
, но требуется скопировать все такие папки (с файлами) в место назначения. Это правильно или вы хотите скопировать только папку 2015
?
Я хочу перебрать каждую папку и скопировать все вложенное содержимое внутри. Так, например, каталог может содержать 2015, 2016, 2017 и т. д. до текущего года. И мы хотим разбить его по годам, чтобы переводы можно было делать самостоятельно.
Когда вы вручную указываете путь как exampledir/yeardir/2015
, вы получаете желаемые результаты, верно?
Да, он копирует папку и содержимое внутри. Проблема в том, что мы хотим параметризовать его, чтобы мы могли использовать exampledir/yeardir/@dataset().directory или просто @dataset().directory для передачи в 2015 году или exampledir/yeardir/2015 (с concat) и скопировать его как что.
Поскольку предоставление exampledir/yeardir/2015
отлично сработало для вас, и вы хотите скопировать все папки, присутствующие в exampledir/yeardir
, вы можете выполнить следующую процедуру:
get metadata
действие, чтобы получить дочерние элементы папки exampledir/yeardir/
(в моей демонстрации я выбрал путь как «maindir/yeardir».).@activity('Get Metadata1').output.childItems
maindir/yeardir/@{item().name}
outputDir/@{item().name}
Поскольку указание пути вручную, как работало exampledir/yeardir/2015
, мы получили список папок года, используя действие получения метаданных. Мы прошлись по каждому из них и скопировали каждую папку с исходным путем как exampledir/yeardir/<current_iteration_year_folder>
.
В зависимости от того, как я указал путь к приемнику, данные будут скопированы с содержимым. Ниже приведено эталонное изображение.
Я следовал вашим инструкциям и в значительной степени пытался сделать что-то подобное раньше, но я забыл использовать @{item.name()} в приемнике. Однако это решение не работает для меня, поскольку оно по-прежнему выводит файл с одним блоком. Однако я очень ценю вашу помощь, это поставило меня в тупик, поскольку я могу воспроизвести желаемое поведение для любого из моих других наборов данных, но не конкретно для этого.
Не уверен, почему процедура работает вручную (например, каталог/год каталог/2015), но не для описанной выше процедуры. Если это не сработает, то предложенный вами обходной путь является лучшим подходом.
Можете ли вы предоставить изображения/информацию (динамический контент или параметры и их значения) конфигурации набора данных для источника и приемника?