Compartilhar via


Modelar dados semiestruturados

Este artigo recomenda padrões para armazenar dados semiestruturados dependendo de como sua organização usa os dados. O Azure Databricks fornece funções, tipos de dados nativos e sintaxe de consulta para trabalhar com dados semiestruturados, aninhados e complexos.

As considerações a seguir afetam qual padrão você deve usar:

  • Os campos ou tipos na fonte de dados são alterados com frequência?
  • Quantos campos exclusivos totais estão contidos na fonte de dados?
  • Você precisa otimizar suas cargas de trabalho para gravações ou leituras?

O Databricks recomenda armazenar dados como tabelas Delta para consultas downstream.

Usar grade

No Databricks Runtime 15.3 e em versões posteriores, é possível usar o tipo VARIANT para armazenar dados JSON semiestruturados usando uma codificação otimizada que é mais adequada do que as cadeias de caracteres JSON para leituras e gravações.

O tipo VARIANT tem aplicativos semelhantes às cadeias de caracteres JSON. Algumas cargas de trabalho ainda se beneficiam do uso de structs, mapas e matrizes, em especial para dados com esquemas conhecidos que se beneficiariam da coleta otimizada de layouts de dados e estatísticas.

Encontre mais detalhes nos seguintes artigos:

Usar cadeias de caracteres JSON

Você pode armazenar dados em uma única coluna de cadeia de caracteres usando a formatação JSON padrão e, em seguida, consultar campos no JSON usando a notação :.

Muitos sistemas geram registros como cadeia de caracteres ou registros JSON codificados por bytes. Ingerir e armazenar esses registros como cadeias de caracteres tem uma sobrecarga de processamento muito baixa. Você também pode usar a função to_json para transformar qualquer estrutura de dados em uma cadeia de caracteres JSON.

Considere os seguintes pontos fortes e fracos ao optar por armazenar dados como cadeias de caracteres JSON:

  • Todos os valores são armazenados como cadeias de caracteres sem informações de tipo.
  • O JSON dá suporte a todos os tipos de dados que podem ser representados usando texto.
  • O JSON dá suporte a cadeias de caracteres de comprimento arbitrário.
  • Não há limites no número de campos que podem ser representados em uma única coluna de dados JSON.
  • Os dados não precisam de pré-processamento antes de serem gravados na tabela.
  • Você pode resolver problemas de tipo presentes nos dados em cargas de trabalho downstream.
  • O JSON fornece o pior desempenho em leitura, pois você deve analisar toda a cadeia de caracteres para cada consulta.

As cadeias de caracteres JSON fornecem grande flexibilidade e uma solução fácil de implementar para obter dados brutos em uma tabela lakehouse. Você pode optar por usar cadeias de caracteres JSON para muitos aplicativos, mas elas são especialmente úteis quando o resultado mais importante de uma carga de trabalho for armazenar uma representação completa e precisa de uma fonte de dados para processamento downstream. Alguns casos de uso podem incluir:

  • Ingerir dados de streaming de um serviço de fila, como o Kafka.
  • Gravação de respostas de consultas à API REST.
  • Armazenamento de registros brutos de uma fonte de dados upstream não controlada pela sua equipe.

Supondo que sua lógica de ingestão seja flexível, o armazenamento de dados como uma cadeia de caracteres JSON deve ser resiliente, mesmo que você encontre novos campos, alterações na estrutura de dados ou alterações de tipo na fonte de dados. Embora as cargas de trabalho downstream possam falhar devido a essas alterações, sua tabela contém um histórico completo dos dados de origem, o que significa que você pode corrigir problemas sem precisar voltar para a fonte de dados.

Usar structs

Você pode armazenar dados semiestruturados com structs e habilitar todas as funcionalidades nativas de colunas, mantendo a estrutura aninhada da fonte de dados.

O Delta Lake trata os dados armazenados como structs da mesma forma que qualquer outra coluna, o que significa que não há diferença funcional de structs e colunas. Os arquivos de dados Parquet usados pelo Delta Lake criam uma coluna para cada campo em um struct. Você pode usar campos struct como colunas de clustering ou colunas de particionamento e pode coletar estatísticas sobre structs para ignorar dados.

Os structs geralmente fornecem o melhor desempenho em leitura, pois dão suporte a todas as otimizações de ignorar dados e armazenam campos individuais como colunas. O desempenho pode começar a ser prejudicado quando o número de colunas presentes chegar às centenas.

Cada campo em um struct tem um tipo de dados, que é imposto na gravação da mesma forma que as colunas. Dessa forma, os structs exigem o pré-processamento completo de dados. Isso pode ser vantajoso quando se deseja que apenas os dados validados sejam confirmados em uma tabela, mas pode levar à perda de dados ou à falha de trabalhos ao processar registros malformados de sistemas upstream.

Os structs são menos flexíveis do que os fluxos JSON para evolução do esquema, seja para tipos de dados em evolução ou para adicionar novos campos.

Usar mapas e matrizes

Você pode usar uma combinação de mapas e matrizes para replicar formatos de dados semiestruturados nativamente no Delta Lake. As estatísticas não podem ser coletadas em campos definidos com esses tipos, mas fornecem um desempenho equilibrado em leitura e gravação para conjuntos de dados semiestruturados que têm cerca de 500 campos.

A chave e o valor dos mapas são digitados, portanto, os dados são pré-processados e o esquema é imposto na gravação.

Para acelerar consultas, o Databricks recomenda armazenar campos que geralmente são usados para filtrar dados como colunas separadas.

Preciso nivelar meus dados?

Se você estiver armazenando seus dados usando JSON ou mapas, considere armazenar campos frequentemente usados para filtrar consultas como colunas. A coleção de estatísticas, o particionamento e o clustering não estão disponíveis para campos dentro de cadeias de caracteres JSON ou mapas. Você não precisa fazer isso para dados armazenados como structs.

Sintaxe para trabalhar com dados aninhados

Revise os recursos a seguir para obter informações sobre como trabalhar com dados aninhados: