Разобрать файл json в U-SQL

Я пытаюсь разобрать ниже файл Json с помощью USQL, но продолжаю получать ошибку.

Json file@

{"dimBetType_SKey":1,"BetType_BKey":1,"BetTypeName":"Test1"}
{"dimBetType_SKey":2,"BetType_BKey":2,"BetTypeName":"Test2"}
{"dimBetType_SKey":3,"BetType_BKey":3,"BetTypeName":"Test3"}

Ниже приведен сценарий USQL, я пытаюсь извлечь данные из вышеуказанного файла.

    REFERENCE ASSEMBLY [Newtonsoft.Json];
    REFERENCE ASSEMBLY [Microsoft.Analytics.Samples.Formats];

DECLARE @Full_Path string =
"adl://xxxx.azuredatalakestore.net/2017/03/28/00_0_66ffdd26541742fab57139e95080e704.json";

DECLARE @Output_Path = "adl://xxxx.azuredatalakestore.net/Output/Output.csv";

@logSchema =
EXTRACT dimBetType_SKey int
FROM @Full_Path
USING new Microsoft.Analytics.Samples.Formats.Json.JsonExtractor();

OUTPUT @logSchema
TO @Output_Path 
USING Outputters.Csv();

Но USQL продолжает давать сбой с ошибкой Vertex

Любая помощь?


person Saz    schedule 30.03.2017    source источник


Ответы (2)


Вероятно, это связано с тем, что у вас есть новые блоки JSON в каждой новой строке файла. Это означает, что вам нужно анализировать его немного по-другому, а не просто файл JSON.

Попробуйте сначала использовать экстрактор текста, чтобы ввести каждый элемент JSON с новым разделителем строк. Как это...

DECLARE @Full_Path string = "etc"

@RawExtract = 
    EXTRACT 
        [RawString] string, 
        [FileName] string //optional, see below
    FROM
        @Full_Path
    USING 
        Extractors.Text(delimiter:'\b', quoting : false);

Затем уничтожьте JSON со сборкой, на которую вы ссылаетесь, но с использованием метода кортежа JSON. Как это...

REFERENCE ASSEMBLY [Newtonsoft.Json];
REFERENCE ASSEMBLY [Microsoft.Analytics.Samples.Formats];

@ParsedJSONLines = 
    SELECT 
        Microsoft.Analytics.Samples.Formats.Json.JsonFunctions.JsonTuple([RawString]) AS JSONLine,
        [FileName]
    FROM 
        @RawExtract

Затем выведите значения. Как это...

@StagedData =
    SELECT 
        JSONLine["dimBetType_SKey"] AS dimBetType_SKey,
        JSONLine["BetType_BKey"] AS BetType_BKey,
        JSONLine["BetTypeName"] AS BetTypeName
        [FileName]
    FROM 
        @ParsedJSONLines;

Наконец, сделайте свой вывод в CSV или что-то еще.

DECLARE @Output_Path string = "etc"

OUTPUT @StagedData
TO @Output_Path 
USING Outputters.Csv();

В качестве примечания: вам не нужно указывать полный путь к хранилищу озера данных. Механизм аналитики знает, где находится корень хранилища, поэтому вы, вероятно, можете заменить свои переменные только этим...

DECLARE @Full_Path string = "/2017/03/28/{FileName}";

Надеюсь, это поможет решить вашу проблему.

person Paul Andrew    schedule 30.03.2017
comment
Спасибо Павел за объяснение этого. Это решило мою проблему. Я нахожусь на ранней стадии обучения, и ваш вклад был очень ценным. Спасибо!. - person Saz; 31.03.2017
comment
@PaulAndrew - я думаю задать это как отдельный вопрос, но что, если вы затем захотите выбрать ВСЕ значения в кортежах / sqlmap, не зная заранее, какие они были? - person Chris B. Behrens; 14.10.2017

К вашему сведению, ADF может помочь вам легко скопировать из JSON (формат JSON) в CSV (текстовый формат). Инструкции можно найти по адресу: https://docs.microsoft.com/en-us/azure/data-factory/data-factory-faq#specifying-formats

Мастер копирования может помочь вам просмотреть данные и настроить конвейер через пользовательский интерфейс. https://docs.microsoft.com/en-us/azure/data-factory/data-factory-copy-data-wizard-tutorial

person Wenbo Fu    schedule 31.03.2017