У меня есть требование получить схему базы данных и сравнить ее с предоставленным CSV-файлом (поступившим из хранилища BLOB-объектов Azure), заголовки которого должны точно соответствовать схеме базы данных, прежде чем начать запись данных CSV в базу данных.
Я планировал использовать 2 get metadata
действия, чтобы получить вышеупомянутые схемы, а затем сравнить их друг с другом.
Я хотел использовать задание forEach
, но я как бы застрял на нем.
Схема базы данных будет меняться «часто» (также довольно обширно), поэтому жестко запрограммированное решение не будет идеальным.
Любая рекомендация о том, как я могу использовать для этого конвейер или поток данных?
Чтобы удовлетворить ваши требования, после обоих действий «Получение метаданных» вы можете использовать действие «Фильтр» и функции contains()
внутри него.
Сначала добавьте список полей количества столбцов в оба действия «Получение метаданных».
Затем добавьте Фильтр действий и используйте в нем динамические выражения ниже.
Items: - @activity('Get table structure').output.structure
Condition - @contains(activity('Get csv structure').output.structure,json(concat('{"name":"',item().name,'","type":"String"}')))
Действие фильтра используется для фильтрации элементов из заданного списка на основе заданного условия.
Оба массива структур не являются идентичными массивами JSON для сравнения. Вот почему дайте массив JSON структуры таблицы в качестве элементов и используйте contains() в условии. contains()
функция выдаст true/false, находится ли данный элемент в данном списке или нет. Передайте массив структур CSV этой функции и создайте JSON в соответствии с этой структурой элемента JSON, используя текущее имя item().name
из массива структур таблицы.
Таким образом, он проверит, существуют ли все имена столбцов из структуры таблицы в структуре CSV, и, если это удовлетворяет, выдаст то же количество, что и ниже.
Позже используйте действие If. В этом выражении проверьте, одинаково ли количество столбцов в обоих действиях «Получение метаданных», а также одинаковое или нет количество столбцов в действии «Фильтр».
@and(equals(activity('Get csv structure').output.columnCount,activity('Get table structure').output.columnCount),equals(activity('Filter1').output.ItemsCount,activity('Filter1').output.FilteredItemsCount))
Внутри Истинной деятельности Если вы можете продолжать свою деятельность.
Поскольку вложенные действия if не поддерживаются в ADF, вам необходимо выполнить проверку заголовков этих столбцов перед действием if и проверить их в выражении действия if. Вы можете проверить несколько выражений в одном и том же выражении, используя вложенное динамическое выражение and()
.
@and(and(<expression>,<expression>)>,and(<expression>,<expression>))