Многострочный Json считывается с помощью пользовательского экстрактора USQL

#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″