Обработка больших JSON в фабрике данных Azure - PullRequest
0 голосов
/ 18 февраля 2020

Я пытаюсь использовать ADF для следующего сценария:

  • a JSON загружен в Azure хранилище BLOB-объектов, содержащее массив похожих объектов
  • это JSON считывается ADF с помощью операции поиска и загружается через веб-активность во внешний приемник

Я не могу использовать операцию копирования, поскольку мне нужно создать полезную нагрузку JSON для Веб-активность, поэтому мне нужно найти массив и вставить его следующим образом (полезная нагрузка веб-активности):

{
   "some field": "value",
   "some more fields": "value",
   ...
   "items": @{activity('GetJsonLookupActivity').output.value}
}

У операции поиска есть известное ограничение верхнего предела в 5000 строк за раз. Если JSON больше, будут прочитаны только 5000 верхних строк, а все остальное будет проигнорировано.

Я знаю это, поэтому у меня есть система, которая разбивает полезные данные на куски по 5000 строк перед загрузкой в ​​хранилище. Но я не единственный пользователь, поэтому есть основания опасаться, что кто-то другой попытается загрузить большие файлы, и конвейер будет молча проходить с частичной загрузкой, в то время как пользователь, очевидно, будет ожидать загрузки всех строк.

Я предложил две концепции для обхода проблемы, но я не вижу, как их реализовать:

  1. Можно ли как-нибудь проверить, есть ли файл JSON слишком велик и выйдет из строя конвейер, если так? Похоже, что операция поиска не позволяет считать строки, а операция получения метаданных возвращает только размер в байтах.

  2. В качестве альтернативы Документы MSDN предлагают обходной путь копирования данных в foreach l oop. Но я не могу понять, как я использовал бы Lookup, чтобы сначала получить строки 1-5000, а затем 5001-10000 et c. от JSON. Это достаточно просто с SQL с использованием OFFSET N FETCH NEXT 5000 ROWS ONLY, но как это сделать с JSON?

1 Ответ

0 голосов
/ 19 февраля 2020

Вы не можете установить любой индексный диапазон (1-5,000,5,000-10,000) при использовании LookUp Activity. Обходной путь, упомянутый в do c, не означает, что вы можете использовать LookUp Activity с нумерацией страниц, в Мое мнение.

Мой обходной путь - написание функции azure для получения общей длины массива json перед передачей данных. Внутри azure функция разделяет данные на разные временные файлы с разбивкой на страницы, как sub1.json,sub2.json.... Затем выведите массив, содержащий имена файлов.

Захватите массив с помощью ForEach Activity, выполните поиск в l oop. Путь к файлу может быть установлен как значение Dynami c. Затем выполните следующую веб-операцию.

Конечно, моя идея может быть улучшена. Например, вы получаете общую длину массива json, и он находится под Ограничение 5000, вы можете просто вернуть {"NeedIterate":false}. Оценить этот ответ по IfCondition Activity, чтобы решить, какой путь должен быть следующим. Если значение равно false, выполнить действие LookUp напрямую. Все можно разделить на ветви.

...