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ção ou leitura?

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

Usar variante

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 arrays, especialmente para dados com esquemas bem conhecidos que se beneficiariam de um layout de dados otimizado e da coleta de 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 existentes nos dados em cargas de trabalho posteriores.
  • 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 estruturas

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

O Delta Lake permite que você use estruturas da mesma maneira que as colunas. Em uma tabela do Delta Lake, os arquivos de dados Parquet criam uma coluna para cada campo de uma estrutura (struct). Você pode usar campos de struct como chaves de clustering, e você pode coletar estatísticas sobre structs para omissão de dados. Você não pode particionar uma tabela por um campo struct. Em vez disso, use o liquid clustering. Consulte Usar clustering líquido para tabelas.

Structs geralmente oferecem o melhor desempenho na leitura, pois suportam todas as otimizações de omissão de dados e armazenam campos individuais em colunas. O desempenho pode começar a ser prejudicado quando o número de colunas presentes chegar às centenas.

Cada campo em uma struct tem um tipo de dados, que é aplicado no momento da gravação, assim como nas colunas. Dessa forma, os structs exigem o pré-processamento completo de dados. Isso pode ser vantajoso quando se quer que apenas dados validados sejam gravados em uma tabela, mas pode levar à perda de dados ou à falha de tarefas ao processar registros malformados de sistemas de origem.

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: