Вставка образца данных в формате JSON в Azure Data Explorer

В этой статье показано, как загрузить данные в формате JSON в базу данных Azure Data Explorer. Вы начинаете с простых примеров необработанного и сопоставленного JSON, продолжайте использовать многострочный json, а затем решаете более сложные схемы JSON, содержащие массивы и словари. В примерах подробно описан процесс приема форматированных данных JSON с помощью язык запросов Kusto (KQL), C#или Python.

Примечание.

Мы не рекомендуем использовать .ingest команды управления в рабочих сценариях. Вместо этого используйте соединитель данных или программным способом прием данных с помощью одной из клиентских библиотек Kusto.

Необходимые компоненты

  • Учетная запись Майкрософт или удостоверение пользователя Microsoft Entra. Подписка Azure не обязательна.
  • Кластер и база данных Azure Data Explorer. Создайте кластер и базу данных.

Формат JSON

Azure Data Explorer поддерживает два формата файлов JSON.

  • json: разделенный строкой JSON. Каждая строка входных данных содержит ровно одну запись JSON. Этот формат поддерживает синтаксический анализ комментариев и одноцитированных свойств. Для получения дополнительной информации см. Строки JSON.
  • multijson: многострочный JSON. Парсер игнорирует разделители строк и считывает запись с предыдущей позиции до конца допустимого JSON.

Примечание.

При приеме с помощью интерфейса получения данных используется multijsonформат по умолчанию. Формат может обрабатывать многостроные записи JSON и массивы записей JSON. При обнаружении ошибки синтаксического анализа весь файл удаляется. Чтобы игнорировать недопустимые записи JSON, выберите параметр "Игнорировать ошибки формата данных"., который переключает формат json на (строки JSON).

Если вы используете формат строки JSON (json), строки, которые не представляют допустимые записи JSON, пропускаются во время синтаксического анализа.

Получение и сопоставление данных в формате JSON

При приеме данных в формате JSON необходимо указать формат с помощью свойства приема данных. Для приема данных JSON требуется сопоставление, которое сопоставляет исходную запись JSON с ее целевым столбцом. При приеме данных используйте IngestionMapping свойство с его ingestionMappingReference свойством приема (для предопределенного сопоставления) приема или его IngestionMappings свойства. В этой статье используется ingestionMappingReference свойство приема, которое предопределено в таблице, используемой для приема. В следующих примерах мы начинаем прием записей JSON в виде необработанных данных в одну таблицу столбцов. Затем мы используем сопоставление для приема каждого свойства в сопоставленный столбец.

Простой пример JSON

Следующий пример представляет собой простой JSON с плоской структурой. Данные содержат информацию о температуре и влажности, собираемую несколькими устройствами. Каждая запись помечается идентификатором и отметкой времени.

{
    "timestamp": "2019-05-02 15:23:50.0369439",
    "deviceId": "2945c8aa-f13e-4c48-4473-b81440bb5ca2",
    "messageId": "7f316225-839a-4593-92b5-1812949279b3",
    "temperature": 31.0301639051317,
    "humidity": 62.0791099602725
}

Получение необработанных записей JSON

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

Используйте язык запросов Kusto для приема данных в необработанном формате JSON.

  1. Выполните вход в https://dataexplorer.azure.com.

  2. Выберите Добавить кластер.

  3. В диалоговом окне Добавить кластер введите URL-адрес кластера в форму https://<ClusterName>.<Region>.kusto.windows.net/, а затем выберите Добавить.

  4. Вставьте следующую команду и выберите Выполнить, чтобы создать таблицу.

    .create table RawEvents (Event: dynamic)
    

    Этот запрос создает таблицу с одним столбцом Eventдинамического типа данных.

  5. Создание сопоставления JSON.

    .create table RawEvents ingestion json mapping 'RawEventMapping' '[{"column":"Event","Properties":{"path":"$"}}]'
    

    Эта команда создает сопоставление и сопоставляет корневой путь JSON $ столбцу Event.

  6. Прием данных в таблице RawEvents.

    .ingest into table RawEvents ('https://kustosamplefiles.blob.core.windows.net/jsonsamplefiles/simple.json') with '{"format":"json", "ingestionMappingReference":"RawEventMapping"}'
    

Прием сопоставленных записей JSON

В этом примере вы загружаете данные записей JSON. Каждое свойство JSON сопоставляется с одним столбцом в таблице.

  1. Создайте новую таблицу со схемой, аналогичной входным данным JSON. Мы используем эту таблицу для всех приведенных ниже примеров и команд приема.

    .create table Events (Time: datetime, Device: string, MessageId: string, Temperature: double, Humidity: double)
    
  2. Создание сопоставления JSON.

    .create table Events ingestion json mapping 'FlatEventMapping' '[{"column":"Time","Properties":{"path":"$.timestamp"}},{"column":"Device","Properties":{"path":"$.deviceId"}},{"column":"MessageId","Properties":{"path":"$.messageId"}},{"column":"Temperature","Properties":{"path":"$.temperature"}},{"column":"Humidity","Properties":{"path":"$.humidity"}}]'
    

    В этом сопоставлении, как определено схемой таблицы, timestamp записи отправляются в столбец Time как datetime типы данных.

  3. Прием данных в таблице Events.

    .ingest into table Events ('https://kustosamplefiles.blob.core.windows.net/jsonsamplefiles/simple.json') with '{"format":"json", "ingestionMappingReference":"FlatEventMapping"}'
    

    В файле simple.json есть несколько записей JSON, разделенных строками. Формат — json, а отображение, используемое в команде приема данных, — это созданное вами FlatEventMapping.

Получение многострочных записей JSON

В этом примере вы загружаете многострочные записи JSON. Каждое свойство JSON сопоставляется с одним столбцом в таблице. В файле Multiined.json есть несколько записей JSON с отступом. multijson Формат указывает на чтение записей по структуре JSON.

Прием данных в таблице Events.

.ingest into table Events ('https://kustosamplefiles.blob.core.windows.net/jsonsamplefiles/multilined.json') with '{"format":"multijson", "ingestionMappingReference":"FlatEventMapping"}'

Принимать записи JSON, содержащие массивы

Тип данных "массив" представляет собой упорядоченную коллекцию значений. Получение массива JSON выполняется политикой обновления. JSON загружается как есть в промежуточную таблицу. Политика обновления запускает предопределенную функцию в RawEvents таблице, повторно возвращая результаты в целевую таблицу. Мы прием данных со следующей структурой:

{
    "records":
    [
        {
            "timestamp": "2019-05-02 15:23:50.0000000",
            "deviceId": "ddbc1bf5-096f-42c0-a771-bc3dca77ac71",
            "messageId": "7f316225-839a-4593-92b5-1812949279b3",
            "temperature": 31.0301639051317,
            "humidity": 62.0791099602725
        },
        {
            "timestamp": "2019-05-02 15:23:51.0000000",
            "deviceId": "ddbc1bf5-096f-42c0-a771-bc3dca77ac71",
            "messageId": "57de2821-7581-40e4-861e-ea3bde102364",
            "temperature": 33.7529423105311,
            "humidity": 75.4787976739364
        }
    ]
}
  1. Создайте функцию update policy, которая расширяет коллекцию records, чтобы каждое значение в коллекции получало отдельную строку, используя оператор mv-expand. Мы используем таблицу RawEvents в качестве исходной таблицы и Events в качестве целевой таблицы.

    .create function EventRecordsExpand() {
        RawEvents
        | mv-expand records = Event.records
        | project
            Time = todatetime(records["timestamp"]),
            Device = tostring(records["deviceId"]),
            MessageId = tostring(records["messageId"]),
            Temperature = todouble(records["temperature"]),
            Humidity = todouble(records["humidity"])
    }
    
  2. Схема, полученная функцией, должна соответствовать схеме целевой таблицы. Используйте оператор getschema для просмотра схемы.

    EventRecordsExpand() | getschema
    
  3. Добавьте политику обновления для целевой таблицы. Эта политика автоматически запускает запрос на все недавно полученные данные в промежуточной RawEvents таблице и возвращает результаты в таблицу Events . Определите политику нулевого хранения, чтобы избежать сохранения промежуточной таблицы.

    .alter table Events policy update @'[{"Source": "RawEvents", "Query": "EventRecordsExpand()", "IsEnabled": "True"}]'
    
  4. Прием данных в таблице RawEvents.

    .ingest into table RawEvents ('https://kustosamplefiles.blob.core.windows.net/jsonsamplefiles/array.json') with '{"format":"multijson", "ingestionMappingReference":"RawEventMapping"}'
    
  5. Просмотрите данные в таблице Events.

    Events