Compartilhar via


Nivelamento, escape e matriz de JSON

Observação

O serviço Time Series Insights será desativado em 7 de julho de 2024. Considere migrar ambientes existentes para soluções alternativas o mais rápido possível. Para obter mais informações sobre a substituição e a migração, visite nossa documentação.

Seu ambiente Azure Time Series Insights Gen2 criará dinamicamente as colunas de seus armazenamentos quentes e frios, seguindo um conjunto específico de convenções de nomenclatura. Quando um evento é ingerido, um conjunto de regras é aplicado à carga JSON, bem como aos nomes de propriedade. Isso abrange o escape de determinados caracteres especiais e o nivelamento de objetos JSON aninhados. É importante ter conhecimento sobre dessas regras para compreender de que maneira a forma do JSON influenciará como os eventos são armazenados e consultados. Veja na tabela abaixo a lista completa de regras. Exemplos A & B também demonstram como você é capaz de agrupar várias séries temporais com eficiência em uma matriz.

Importante

  • Examine as regras abaixo antes de selecionar uma propriedade de ID da Série Temporal e/ou o carimbo de data/hora de origem do evento propert(ies). Se sua ID TS ou carimbo de data/hora estiver dentro de um objeto aninhado, ou contiver um ou mais dos caracteres especiais listados abaixo, é importante garantir que o nome da propriedade que você fornecer corresponda ao nome da coluna após a aplicação das regras de ingestão. Veja o exemplo B abaixo.
Regra JSON de exemplo Sintaxe de Expressão de Série Temporal Nome da coluna de propriedade em Parquet
Os tipos de dados do Azure Time Series Insights Gen2 estão anexados ao final do nome da coluna como "_<tipoDeDados>" "type": "Accumulated Heat" $event.type.String type_string
A propriedade timestamp da origem do evento será salva no Azure Time Series Insights Gen2 como "timestamp" no armazenamento, e o valor será armazenado em UTC. Você pode personalizar a propriedade de timestamp da(s) fonte(s) do evento para atender às necessidades da sua solução, mas o nome da coluna no armazenamento quente e frio é "timestamp". Outras propriedades JSON de datetime que não são o timestamp de origem do evento serão salvas com "_datetime" no nome da coluna, conforme mencionado na regra acima. "ts": "2020-03-19 14:40:38.318" $event.$ts timestamp
Nomes de propriedades JSON que abrangem os caracteres especiais. [ \ e ' são escapados com [' e '] "id.wasp": "6A3090FD337DE6B" $event['id.wasp'].String ['id.wasp']_string
Em [' e '], há o escape adicional de aspas simples e barras invertidas. A aspa simples é escrita como \’, e a barra invertida como \\ "Foo's Law Value": "17.139999389648" $event['Foo\'s Law Value'].Double ['Foo\'s Law Value']_double
Os objetos JSON aninhados são nivelados com um ponto como separador. Há suporte para o aninhamento de até 10 níveis. "series": {"value" : 316 } $event.series.value.Long, $event['series']['value'].Long ou $event.series['value'].Long series.value_long
As matrizes de tipos primitivos são armazenadas como um tipo dinâmico "values": [154, 149, 147] Os tipos dinâmicos só podem ser recuperados por meio da API GetEvents values_dynamic
Arrays que contêm objetos têm dois comportamentos, dependendo do conteúdo do objeto: se a(s) ID(s) de TS ou a(s) propriedade(s) de carimbo de data/hora estiver(em) dentro dos objetos em uma array, a array será desdobrada de modo que o conteúdo JSON inicial produza múltiplos eventos. Isso permite que você lote vários eventos em uma estrutura JSON. Todas as propriedades de nível superior que são pares da matriz serão salvas com cada objeto não registrado. Se suas ID(s) TS e carimbo de data/hora não estiverem dentro da matriz, eles serão salvos inteiramente como o tipo dinâmico. Veja os exemplos A, B e C abaixo
Matrizes contendo elementos mistos não são achatadas. "values": ["foo", {"bar" : 149}, 147] Os tipos dinâmicos só podem ser recuperados por meio da API GetEvents values_dynamic
512 caracteres é o limite de nome da propriedade JSON. Se o nome exceder 512 caracteres, ele será truncado para 512 e '_<'hashCode'>' será acrescentado. Observe que isso também se aplica a nomes de propriedade que foram concatenados a partir de um objeto achatado, denotando um caminho de objeto aninhado. "data.items.datapoints.values.telemetry<...continuing to over 512 chars>" : 12.3440495 "$event.data.items.datapoints.values.telemetry<...continuing to include all chars>.Double" data.items.datapoints.values.telemetry<...continuing to 512 chars>_912ec803b2ce49e4a541068d495ab570_double

Compreendendo o comportamento dual para matrizes

As matrizes de objetos serão armazenadas por inteiro ou divididas em vários eventos, dependendo de como você modelar seus dados. Isso permite que você use uma matriz para eventos em lote e evite repetir propriedades de telemetria definidas no nível do objeto raiz. O envio em lote pode ser vantajoso, pois resulta em menos Hubs de Eventos ou mensagens de Hub IoT enviadas.

No entanto, em alguns casos, matrizes que contêm objetos só são significativas no contexto de outros valores. A criação de vários eventos renderiza os dados sem significado. Para garantir que uma matriz de objetos seja armazenada as-is como um tipo dinâmico, siga as diretrizes de modelagem de dados abaixo e dê uma olhada no exemplo C

Como saber se minha matriz de objetos produzirá vários eventos

Se uma ou mais de suas IDs da Série Temporal estiverem aninhadas em objetos em uma matriz ou se a propriedade de carimbo de data/hora de origem do evento estiver aninhada, o mecanismo de ingestão a dividirá para criar vários eventos. Os nomes de propriedade que você forneceu para suas IDs de TS e/ou carimbo de data/hora devem seguir as regras de achatamento acima e, portanto, indicarão a forma do seu JSON. Veja os exemplos abaixo e confira o guia sobre como selecionar uma propriedade de ID de Série Temporal.

Exemplo A

ID da Série Temporal na raiz do objeto e no carimbo de data/hora aninhado
ID da Série Temporal do Ambiente:"id"
Carimbo de data/hora de origem do evento:"values.time"
Conteúdo JSON:

[
    {
        "id": "caaae533-1d6c-4f58-9b75-da102bcc2c8c",
        "values": [
            {
                "time": "2020-05-01T00:59:59.000Z",
                "value": 25.6073
            },
            {
                "time": "2020-05-01T01:00:29.000Z",
                "value": 43.9077
            }
        ]
    },
    {
        "id": "1ac87b74-0865-4a07-b512-56602a3a576f",
        "values": [
            {
                "time": "2020-05-01T00:59:59.000Z",
                "value": 0.337288
            },
            {
                "time": "2020-05-01T01:00:29.000Z",
                "value": 4.76562
            }
        ]
    }
]

Resultado no arquivo Parquet:
A configuração e o conteúdo acima produzirão três colunas e quatro eventos

carimbo de data/hora id_string values.value_double
2020-05-01T00:59:59.000Z caaae533-1d6c-4f58-9b75-da102bcc2c8c 25.6073
2020-05-01T01:00:29.000Z caaae533-1d6c-4f58-9b75-da102bcc2c8c 43.9077
2020-05-01T00:59:59.000Z 1ac87b74-0865-4a07-b512-56602a3a576f 0.337288
2020-05-01T01:00:29.000Z 1ac87b74-0865-4a07-b512-56602a3a576f 4.76562

Exemplo B

ID da série temporal composta com uma propriedade aninhada
ID da Série Temporal do Ambiente:"plantId" e "telemetry.tagId"
Carimbo de data/hora de origem do evento:"timestamp"
Conteúdo JSON:

[
    {
        "plantId": "9336971",
        "timestamp": "2020-01-22T16:38:09Z",
        "telemetry": [
            {
                "tagId": "100231-A-A6",
                "tagValue": -31.149018
            },
            {
                "tagId": "100231-A-A1",
                "tagValue": 20.560796
            },
            {
                "tagId": "100231-A-A9",
                "tagValue": 177
            },
            {
                "tagId": "100231-A-A8",
                "tagValue": 420
            },
        ]
    },
    {
        "plantId": "9336971",
        "timestamp": "2020-01-22T16:42:14Z",
        "telemetry": [
            {
                "tagId": "103585-A-A7",
                "value": -30.9918
            },
            {
                "tagId": "103585-A-A4",
                "value": 19.960796
            }
        ]
    }
]

Resultado no arquivo Parquet:
A configuração e o conteúdo acima produzirão quatro colunas e seis eventos

carimbo de data/hora plantId_string telemetry.tagId_string telemetria.valor_duplo
2020-01-22T16:38:09Z 9336971 100231-A-A6 -31.149018
2020-01-22T16:38:09Z 9336971 100231-A-A1 20.560796
2020-01-22T16:38:09Z 9336971 100231-A-A9 177
2020-01-22T16:38:09Z 9336971 100231-A-A8 420
2020-01-22T16:42:14Z 9336971 100231-A-A7 -30.9918
2020-01-22T16:42:14Z 9336971 100231-A-A4 19.960796

Exemplo C

ID da Série Temporal e o carimbo de data/hora estão na raiz do objeto
ID da Série Temporal Ambiental:"id"
Carimbo de data/hora de origem do evento:"timestamp"
Conteúdo JSON:

{
    "id": "800500054755",
    "timestamp": "2020-11-01T10:00:00.000Z",
    "datapoints": [{
            "value": 120
        },
        {
            "value": 124
        }
    ]
}

Resultado no arquivo Parquet:
A configuração e o conteúdo acima produzirão três colunas e um evento

carimbo de data/hora id_string pontos_de_dados_dinâmicos
2020-11-01T10:00:00.000Z 800500054755 [{"value": 120},{"value":124}]

Próximas etapas