Nota
O acesso a esta página requer autorização. Podes tentar iniciar sessão ou mudar de diretório.
O acesso a esta página requer autorização. Podes tentar mudar de diretório.
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 operações de escrita ou leitura?
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 sequência de caracteres usando a formatação JSON padrão e, em seguida, consultar campos no JSON usando a 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 os structs e habilitar todas as funcionalidades nativas das 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 salto 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 numa estrutura tem um tipo de dados, que é aplicado na escrita da mesma forma que nas colunas. Como tal, as estruturas exigem um pré-processamento completo dos dados. Isso pode ser benéfico quando se pretende apenas dados validados inseridos numa tabela, mas pode levar à perda de dados ou a falhas em tarefas ao processar registos malformados de sistemas a montante.
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 de dados são tipificados, portanto, os dados são pré-processados e o esquema é aplicado na escrita.
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: