Фабрика данных Azure (ADF). Можно ли сравнить схему CSV-файла со схемой базы данных перед записью в него?

У меня есть требование получить схему базы данных и сравнить ее с предоставленным CSV-файлом (поступившим из хранилища BLOB-объектов Azure), заголовки которого должны точно соответствовать схеме базы данных, прежде чем начать запись данных CSV в базу данных.

Я планировал использовать 2 get metadata действия, чтобы получить вышеупомянутые схемы, а затем сравнить их друг с другом.

Я хотел использовать задание forEach, но я как бы застрял на нем.

Схема базы данных будет меняться «часто» (также довольно обширно), поэтому жестко запрограммированное решение не будет идеальным.

Любая рекомендация о том, как я могу использовать для этого конвейер или поток данных?


53
1

Ответ:

Решено

Чтобы удовлетворить ваши требования, после обоих действий «Получение метаданных» вы можете использовать действие «Фильтр» и функции 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>))

Интересные вопросы для изучения