#u-sql
Вопрос:
Я не смог найти правильное решение, чтобы использовать Newtonsoft JsonExtractor для анализа входного файла с новым разделителем строк.
Из JsonExtractor Newtonsoft я могу успешно прочитать первую строку, когда она взорвана «$.d.результаты [*]», но она не переходит к следующей строке,
Поскольку данные составляют >4 МБ для каждой строки, их невозможно извлечь в виде текста. Поэтому для продолжения анализа необходимо выполнить анализ с помощью пользовательского экстрактора.
Ввод Образца:
{"d":{"results":[{"data":{"Field_1":"1","Field_2":"2"},"Field_3":"3","Field_4":"4"}]}}
{"d":{"results":[{"data":{"Field_1":"11","Field_2":"21"},"Field_3":"31","Field_4":"41"}]}}
{"d":{"results":[{"data":{"Field_1":"12","Field_2":"22"},"Field_3":"32","Field_4":"42"}]}}
Ожидаемый Результат:
Field_1|Field_2|Field_3|Field_4
1 |2 |3 |4
11 |21 |31 |41
12 |22 |32 |42
Код USQL:
CREATE ASSEMBLY IF NOT EXISTS [Microsoft.Analytics.Samples.Formats] FROM @"Microsoft.Analytics.Samples.Formats.dll";
CREATE ASSEMBLY IF NOT EXISTS [Newtonsoft.Json] FROM @"Newtonsoft.Json.dll";
REFERENCE ASSEMBLY [Microsoft.Analytics.Samples.Formats];
REFERENCE ASSEMBLY [Newtonsoft.Json];
USING Microsoft.Analytics.Samples.Formats.Json;
DECLARE @DATA_SOURCE string = "Input.data" ;
@SOURCE =
EXTRACT Field_1 string,
Field_2 string,
Field_3 string,
Field_4 string
FROM @DATA_SOURCE
USING new JsonExtractor("$.d.results[*]");
Ответ №1:
Учитывая ваши исходные данные, как показано ниже, т. е. Более одного документа JSON в файле.
{
"d": {
"results": [
{
"data": {
"Field_1": "1",
"Field_2": "2"
},
"Field_3": "3",
"Field_4": "4"
}
]
}
}
{
"d": {
"results": [
{
"data": {
"Field_1": "11",
"Field_2": "21"
},
"Field_3": "31",
"Field_4": "41"
}
]
}
}
{
"d": {
"results": [
{
"data": {
"Field_1": "12",
"Field_2": "22"
},
"Field_3": "32",
"Field_4": "42"
}
]
}
}
// если в файле более одного документа JSON
Сборка JSON включает в себя многоуровневый jsonэкстрактор, который позволяет нам извлекать данные из нескольких путей JSON на разных уровнях за один проход. Смотрите базовый код и встроенную документацию на Github.
Используйте его, предоставляя несколько уровней путей Json. Они будут назначены схеме по индексу.
Фрагмент кода показывает многоуровневый Jsonextractor в действии.
- Первый параметр (путь к строке) указывает базовый путь для начала.
- Второй параметр (обход предупреждения) ожидает логическое значение. True = Если путь не найден: не ошибитесь, верните значение null. Ложь = Если путь не найден: ошибка.
- Третий параметр (jsonPaths) представляет собой список путей JSON, начинающихся с базового пути, в противном случае экстрактор будет рекурсивно перемещаться в верхнюю часть дерева, чтобы найти его.
в твоем случае….
@json =
EXTRACT
Field_1 string,
Field_2 string,
Field_3 string,
Field_4 string,
FROM
@DATA_SOURCE
USING new MultiLevelJsonExtractor("d.results[*]",
true,
"data.Field_1",
"data.Field_2",
"Field_3",
"Field_4",
);
Комментарии:
1. Спасибо за ваши выводы, но я не нахожу это работающим. Ссылка, представленная в GitHub, использует многоуровневый образец json, который является фактическим файлом Json с несколькими строками, но здесь я получил многострочный массив Json, но не сам файл Json (если вы заметили, что между строками нет запятой). При попытке я получил ошибку «Дополнительный текст, обнаруженный после завершения чтения содержимого JSON: {. Путь», строка 2, позиция 0″