Оператор mv-expand в Azure Data Explorer не работает должным образом для JSON Array - PullRequest
0 голосов
/ 04 апреля 2020

Я пытаюсь следовать инструкциям в документации для загрузки массива JSON и создания записей для каждого элемента в массиве в Azure Обозревателе данных, но все идет не так, как ожидалось ,

В моей промежуточной таблице есть несколько полей верхнего уровня, которые я хочу перенести, и это работает, но все поля массива просто пустые.

.create function RecordsExpandTest() {
    records_intermediate_test
    | mv-expand records_test = answers
    | project
        fullraw = tostring(fullraw),
        question = tostring(question),
        question_class = tostring(question_class),
        question_raw = tostring(question_raw),
        answer_class = tostring(answers["class"]),
        answer_type = tostring(answers["type"]),
        answer_raw = tostring(answers["raw"]),
        request_time = todatetime(request_time)
}

Когда я глотаю строку в моя промежуточная таблица (records_intermediate_test), которая имеет массив из 3 ответов, в итоговой таблице (records_test) создается 3 строки, но все поля, связанные с ответами, пусты, даже если в исходных данных их нет.

Создать для промежуточной таблицы:

.create table records_intermediate_test(fullraw: string, question: string, question_class: string, question_raw: string, answers : dynamic, request_time: datetime)

Создать для финальной таблицы:

.create table records_test(fullraw: string, question: string, question_class: string, question_raw: string, answer_class : string, answer_type: string, answer_raw : string, request_time: datetime)

Изменить таблицу, которая применяет расширение mv:

.alter table records_test policy update @'[{"Source": "records_intermediate_test", "Query": "RecordsExpandTest()", "IsEnabled": "True"}]'

Пример строки из records_intermediate_test

"fullraw": TEST,
"question": TEST,
"question_class": TEST,
"answers": [
    {
        "class": "C",
        "type": "C",
        "raw": "TEST"
    },
    {
        "class": "B",
        "type": "B",
        "raw": "TEST"
    },
    {
        "class": "A",
        "type": "A",
        "raw": "TEST"
    }
],
"request_time": 2019-01-01T10:07:49.0105654Z

Пример строки из records_test

"fullraw": TEST,
"question": TEST,
"question_class": TEST,
"answer_class": ,
"answer_type": ,
"answers_raw": ,
"request_time": 2019-01-01T10:07:49.0105654Z

^ Повторяется 3 раза в таблице

Ожидаемые строки из records_test

"fullraw": TEST,
"question": TEST,
"question_class": TEST,
"answer_class": A,
"answer_type": A,
"answers_raw": TEST,
"request_time": 2019-01-01T10:07:49.0105654Z

"fullraw": TEST,
"question": TEST,
"question_class": TEST,
"answer_class": B,
"answer_type": B,
"answers_raw": TEST,
"request_time": 2019-01-01T10:07:49.0105654Z

"fullraw": TEST,
"question": TEST,
"question_class": TEST,
"answer_class": C,
"answer_type": C,
"answers_raw": TEST,
"request_time": 2019-01-01T10:07:49.0105654Z

Входные данные промежуточной таблицы всегда содержат массив с 1 вопросом. Это отображение:

.create table records_intermediate_test ingestion json mapping 'mappingtest' 
'['
'   { "column" : "fullraw", "Properties":{"Path":"$.fullraw"}},'
'   { "column" : "question", "Properties" {"Path":"$.question[0].question"}},'
'   { "column" : "question_class", "Properties":{"Path":"$.question[0].class"}},'
'   { "column" : "question_raw", "Properties":{"Path":"$.question[0].raw"}},'
'   { "column" : "answers", "Properties":{"Path":"$.answers"}},'
    '   { "column" : "request_time", "Properties":{"Path":"$.request_time"}}'
']'

Пример необработанного JSON вход для таблицы records_intermediate_test:

{
"fullraw": "TEST",
"question": "TEST",
"question_class": "TEST",
"answers": [
    {
        "class": "C",
        "type": "C",
        "raw": "TEST"
    },
    {
        "class": "B",
        "type": "B",
        "raw": "TEST"
    },
    {
        "class": "A",
        "type": "A",
        "raw": "TEST"
    }
],
"request_time": 2019-01-01T10:07:49.0105654Z
}

Ответы [ 2 ]

1 голос
/ 05 апреля 2020

Измените функцию, используемую политикой обновления, чтобы включить эти поля:

.create function RecordsExpandTest() {
records_intermediate_test
| mv-expand records_test = answers
| project
    fullraw = tostring(fullraw),
    question = tostring(question),
    question_class = tostring(question_class),
    question_raw = tostring(question_raw),
    answer_class = tostring(answers["class"]),
    answer_type = tostring(answers["type"]),
    answer_raw = tostring(answers["raw"]),
    request_time = todatetime(request_time),
    MyTopLevelField
}

Убедитесь, что промежуточная таблица и таблица назначения соответствуют вашей схеме:

.create table RawEvents ingestion json mapping 'RawEventMapping' '[{"column":"Answers","path":"$.answers"}, {"column":"MyTopLevelField","path":"$.myTopLevelField"}]'
0 голосов
/ 07 апреля 2020

@ Керен отвечал правильно. Я должен был только отображать поля в массиве и просто оставить остальные как есть. Это моя функция расширения, которая работала:

.create function RecordsExpandTest() {
    dns_records_intermediate
    | mv-expand dns_records = answers
     | project
        request_time,
        fullraw,
        question_class,
        question,
        question_raw,
        answer_class = tostring(answer.class),
        answer_raw = tostring(answer.raw),
        answer_type = tostring(answer.type)
}

С этим новым отображением, когда я вставляю запись в records_intermediate_test с массивом из 3 ответов, создается 1 запись в records_intermediate_test и 3 в records_test со всеми сопоставленными полями как и ожидалось.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...