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 mudam 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 o armazenamento de dados como tabelas Delta para consultas downstream.
Variante de uso
No Databricks Runtime 15.3 e superior, você pode usar o VARIANT
tipo para armazenar dados JSON semiestruturados usando uma codificação otimizada que supera as cadeias de caracteres JSON para leituras e gravações.
O VARIANT
tipo tem aplicativos semelhantes como 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 do layout de dados otimizado e da coleta de estatísticas.
Para obter mais detalhes, consulte os seguintes artigos:
- Consultar dados de variantes
- Qual é a diferença entre variante e cadeias de caracteres JSON?
- Ingerir dados como tipo de variante semiestruturada
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 :
notação.
Muitos sistemas produzem registros como registros JSON codificados em cadeia de caracteres ou bytes. Ingerir e armazenar esses registros como strings tem uma sobrecarga de processamento muito baixa. Você também pode usar a to_json
função para transformar qualquer struct 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.
- JSON suporta todos os tipos de dados que podem ser representados usando texto.
- JSON suporta cadeias de caracteres de comprimento arbitrário.
- Não há limites para o número de campos que podem ser representados em uma única coluna de dados JSON.
- Os dados não requerem pré-processamento antes de gravar na tabela.
- Você pode resolver problemas de tipo presentes nos dados em cargas de trabalho downstream.
- JSON fornece o pior desempenho na leitura, pois você deve analisar a cadeia de caracteres inteira 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 é 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 a consultas da 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 se você encontrar 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 à fonte de dados.
Usar estruturas
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 uma estrutura. Você pode usar campos struct como colunas de clustering ou colunas de particionamento e pode coletar estatísticas sobre structs para pular dados.
As estruturas geralmente fornecem o melhor desempenho em leitura, pois suportam todas as otimizações de pulo de dados e armazenam campos individuais como colunas. O desempenho pode começar a sofrer quando o número de colunas presentes chega às centenas.
Cada campo em uma struct tem um tipo de dados, que é imposto na gravação da mesma forma que as colunas. Como tal, as estruturas exigem um pré-processamento completo dos dados. Isso pode ser benéfico quando você deseja apenas dados validados comprometidos em uma tabela, mas pode levar a dados perdidos ou trabalhos com falha ao processar registros malformados de sistemas upstream.
As estruturas são menos flexíveis do que os fluxos JSON para a evolução do esquema, seja para a evolução de tipos de dados ou para a adição de 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 desempenho equilibrado em leitura e gravação para conjuntos de dados semiestruturados que têm cerca de 500 campos.
Tanto a chave quanto o valor dos mapas são digitados, portanto, os dados são pré-processados e o esquema é imposto na gravação.
Para acelerar as consultas, o Databricks recomenda armazenar campos que são frequentemente usados para filtrar dados como colunas separadas.
Preciso de nivelar os meus dados?
Se você estiver armazenando seus dados usando JSON ou mapas, considere armazenar campos usados com freqüência para filtrar consultas como colunas. Coleta de estatísticas, particionamento e 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
Analise os seguintes recursos para obter informações sobre como trabalhar com dados aninhados: