Partilhar via


Ingerir dados de exemplo formatados JSON no Azure Data Explorer

Este artigo mostra-lhe como ingerir dados formatados JSON numa base de dados do Azure Data Explorer. Irá começar com exemplos simples de JSON não processado e mapeado, continuar para JSON multi-forrado e, em seguida, abordar esquemas JSON mais complexos que contenham matrizes e dicionários. Os exemplos detalham o processo de ingestão de dados formatados JSON com Linguagem de Pesquisa Kusto (KQL), C#ou Python.

Nota

Não recomendamos a utilização de .ingest comandos de gestão em cenários de produção. Em vez disso, utilize um conector de dados ou ingera dados através de programação através de uma das bibliotecas de cliente kusto.

Pré-requisitos

  • Uma conta Microsoft ou uma identidade de utilizador Microsoft Entra. Não é necessária uma subscrição do Azure.
  • Um cluster e uma base de dados do Azure Data Explorer. Criar um cluster e uma base de dados.

O formato JSON

O Azure Data Explorer suporta dois formatos de ficheiro JSON:

  • json: JSON separado por linhas. Cada linha nos dados de entrada tem exatamente um registo JSON. Este formato suporta a análise de comentários e propriedades com uma única citação. Para obter mais informações, veja Linhas JSON.
  • multijson: JSON multi-forrado. O analisador ignora os separadores de linha e lê um registo da posição anterior até ao fim de um JSON válido.

Nota

Ao ingerir com o assistente de ingestão, o formato predefinido é multijson. O formato pode processar registos JSON multiline e matrizes de registos JSON. Quando é encontrado um erro de análise, todo o ficheiro é eliminado. Para ignorar registos JSON inválidos, selecione a opção "Ignorar erros de formato de dados", que mudará o formato para json (Linhas JSON).

Se estiver a utilizar o formato de Linha JSON (json), as linhas que não representam registos JSON válidos são ignoradas durante a análise.

Ingerir e mapear dados formatados JSON

A ingestão de dados formatados JSON requer que especifique o formato com a propriedade ingestão. A ingestão de dados JSON requer mapeamento, que mapeia uma entrada de origem JSON para a coluna de destino. Ao ingerir dados, utilize a propriedade com a IngestionMapping respetiva ingestionMappingReference propriedade de ingestão (para um mapeamento predefinido) ou a respetiva IngestionMappings propriedade. Este artigo utilizará a ingestionMappingReference propriedade ingestão, que é predefinida na tabela utilizada para ingestão. Nos exemplos abaixo, vamos começar por ingerir registos JSON como dados não processados numa única tabela de colunas. Em seguida, vamos utilizar o mapeamento para ingerir cada propriedade na coluna mapeada.

Exemplo JSON simples

O exemplo seguinte é um JSON simples, com uma estrutura plana. Os dados têm informações de temperatura e humidade, recolhidas por vários dispositivos. Cada registo é marcado com um ID e carimbo de data/hora.

{
    "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
}

Ingerir registos JSON não processados

Neste exemplo, irá ingerir registos JSON como dados não processados numa única tabela de colunas. A manipulação de dados, a utilização de consultas e a política de atualização são efetuadas após a ingestão dos dados.

Utilize Linguagem de Pesquisa Kusto para ingerir dados num formato JSON não processado.

  1. Inicie sessão em https://dataexplorer.azure.com.

  2. Selecione Adicionar cluster.

  3. Na caixa de diálogo Adicionar cluster , introduza o URL do cluster no formulário https://<ClusterName>.<Region>.kusto.windows.net/e, em seguida, selecione Adicionar.

  4. Cole o seguinte comando e selecione Executar para criar a tabela.

    .create table RawEvents (Event: dynamic)
    

    Esta consulta cria uma tabela com uma única Event coluna de um tipo de dados dinâmico .

  5. Crie o mapeamento JSON.

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

    Este comando cria um mapeamento e mapeia o caminho $ de raiz JSON para a Event coluna.

  6. Ingerir dados na RawEvents tabela.

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

Ingerir registos JSON mapeados

Neste exemplo, irá ingerir dados de registos JSON. Cada propriedade JSON é mapeada para uma única coluna na tabela.

  1. Crie uma nova tabela, com um esquema semelhante aos dados de entrada JSON. Vamos utilizar esta tabela para todos os seguintes exemplos e comandos de ingestão.

    .create table Events (Time: datetime, Device: string, MessageId: string, Temperature: double, Humidity: double)
    
  2. Crie o mapeamento 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"}}]'
    

    Neste mapeamento, conforme definido pelo esquema da tabela, as timestamp entradas serão ingeridas na coluna Time como datetime tipos de dados.

  3. Ingerir dados na Events tabela.

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

    O ficheiro "simple.json" tem alguns registos JSON separados por linhas. O formato é json, e o mapeamento utilizado no comando ingestão é o FlatEventMapping que criou.

Ingerir registos JSON multilindrados

Neste exemplo, irá ingerir registos JSON multilindrados. Cada propriedade JSON é mapeada para uma única coluna na tabela. O ficheiro "multilined.json" tem alguns registos JSON com avanço. O formato multijson indica para ler registos pela estrutura JSON.

Ingerir dados na Events tabela.

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

Ingerir registos JSON que contêm matrizes

Os tipos de dados de matriz são uma coleção ordenada de valores. A ingestão de uma matriz JSON é feita por uma política de atualização. O JSON é ingerido tal como está numa tabela intermédia. Uma política de atualização executa uma função predefinida na RawEvents tabela, reestando os resultados para a tabela de destino. Iremos ingerir dados com a seguinte estrutura:

{
    "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. Crie uma função update policy que expanda a coleção de records para que cada valor na coleção receba uma linha separada, utilizando o mv-expand operador. Vamos utilizar a tabela RawEvents como uma tabela de origem e Events como uma tabela de destino.

    .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. O esquema recebido pela função tem de corresponder ao esquema da tabela de destino. Utilize getschema o operador para rever o esquema.

    EventRecordsExpand() | getschema
    
  3. Adicione a política de atualização à tabela de destino. Esta política irá executar automaticamente a consulta em quaisquer dados recentemente ingeridos na RawEvents tabela intermédia e ingerir os resultados na Events tabela. Defina uma política de retenção zero para evitar manter a tabela intermédia.

    .alter table Events policy update @'[{"Source": "RawEvents", "Query": "EventRecordsExpand()", "IsEnabled": "True"}]'
    
  4. Ingerir dados na RawEvents tabela.

    .ingest into table RawEvents ('https://kustosamplefiles.blob.core.windows.net/jsonsamplefiles/array.json') with '{"format":"multijson", "ingestionMappingReference":"RawEventMapping"}'
    
  5. Reveja os dados na Events tabela.

    Events