Dados semiestruturados estão por toda parte em IA, logs de aplicativos e telemetria. Esses dados são úteis, mas a alteração de esquemas dificulta o armazenamento e a consulta. Durante anos, a prática padrão foi armazenar esses dados como strings. As strings eram flexíveis, mas tinham baixo desempenho de consulta, já que o mecanismo precisava analisar e pesquisar em toda a string.
O tipo de dado Variant, agora ratificado no Apache Parquet™, adota uma abordagem diferente. Ele armazena os dados em um formato binário compacto que é flexível e performático para consultas. Essa abordagem não está vinculada a um único mecanismo ou formato: o Variant é o padrão aberto para dados semiestruturados em todo o lakehouse, com suporte em Apache Spark™, Delta Lake e Apache Iceberg™.
Neste post, abordaremos:
No ano passado, colaboramos com a comunidade de código aberto para apresentar o Variant ao Apache Spark™ e Delta Lake. Esse novo tipo de dados oferece flexibilidade e performance em comparação com o armazenamento de dados semiestruturados como strings (que têm baixa performance) ou structs (que não são flexíveis).
O lançamento do Variant atraiu rapidamente o interesse de outros grandes projetos de código aberto, incluindo o Apache Iceberg™ e o Apache Arrow™. Para unificar o ecossistema, propusemos levar o Variant para todos os mecanismos e formatos, incorporando o tipo diretamente no Parquet e movendo a implementação do Spark para o projeto de código aberto Parquet-java, contribuindo com mais de 9.600 linhas de código. Isso permite que todos os formatos de tabela abertos aproveitem facilmente o tipo de dados Variant.
Agora que o Variant foi aprovado na comunidade Parquet, todo o ecossistema de lakehouse tem um tipo de dado padrão e aberto para dados semiestruturados. O Variant já tem suporte em formatos de tabela abertos: o Delta incluiu suporte ao Variant no último ano e, em maio passado, o Iceberg aprovou a v3, que inclui suporte ao Variant. Consequentemente, os usuários que utilizam Delta ou Iceberg agora podem se beneficiar da flexibilidade e do desempenho do Variant.
Os artefatos da Variante Parquet incluem:
Os protocolos do Delta e do Iceberg para suporte ao Variant são:
Agradecemos a todos os indivíduos e organizações envolvidos por suas contribuições em várias comunidades de código aberto, incluindo Apache Parquet™, Apache Spark™, Apache Iceberg™, Delta Lake e Apache Arrow™.
O Variant usa um formato de codificação binária para fornecer uma interface flexível para o armazenamento de dados. O Variant também tem um esquema de shredding, uma técnica para armazenar o Variant de forma mais eficiente para melhorar o desempenho.
O tipo de dados Variant aproveita um esquema de codificação binária eficiente para representar dados semiestruturados. Em vez de armazenar os dados como um valor de texto simples (como JSON), os dados Variant codificam os valores e a estrutura em um formato binário que prioriza a navegação eficiente.
Navegar em uma string JSON exige a leitura e o processamento de todo o objeto JSON para encontrar o campo relevante. Com a codificação binária Variant, a estrutura dos dados é codificada usando deslocamentos para outros locais dentro do valor Variant. Com esses deslocamentos, navegar pela estrutura Variant não exige a leitura ou o processamento de todo o valor. Essa navegação baseada em deslocamentos melhora muito o desempenho do processamento de dados semiestruturados.
Este exemplo demonstra que navegar até o caminho order.item.name requer examinar apenas algumas partes do valor Variant usando os offsets. Isso reduz a quantidade de dados a serem processados/analisados e leva a um desempenho mais rápido.
O desmembramento extrai automaticamente campos comuns dos valores Variant. Esses campos são armazenados como chunks separados e tipados na mesma coluna. Sem o shredding, todo o valor do Variant é armazenado como um único "blob binário" no arquivo.
Há várias vantagens de desempenho para o shredding de Variants:
Este exemplo demonstra que, com o shredding, a varredura só precisa ler as colunas exigidas pela consulta. A varredura usa as estatísticas de coluna do Parquet, então os grupos de linhas irrelevantes podem ser completamente ignorados. A leitura de arquivos que passaram por shredding melhora o desempenho, pois evita trabalho desnecessário.
O formato binário do Variant e a técnica de shredding permitem melhorias significativas de desempenho em comparação com o armazenamento de dados semiestruturados como strings JSON. Realizamos benchmarks de desempenho usando dados semiestruturados baseados no TPC-DS para comparar as representações Variant e de string.
Em comparação com o armazenamento de JSON como string, o Variant tem um desempenho de leitura 8x mais rápido. Com o shredding, as gravações do Variant são de 20% a 50% mais lentas, mas as leituras são 30x mais rápidas, demonstrando seu desempenho e eficiência.
Com suporte nativo para Parquet, Delta e Iceberg, o tipo de dados Variant é o tipo de dados aberto e padronizado para dados semiestruturados. Ao eliminar a necessidade de ETLs complexos e análises frágeis, o Variant capacita os usuários a analisar dados de forma rápida, fácil e confiável.
Criar uma tabela com uma coluna Variant é fácil:
Para carregar dados Variant, o Databricks oferece suporte a funções de ingestão do Variant de fontes JSON, XML e CSV:
O shredding do Variant tem suporte no DBR 17.2+ (DBSQL 2025.30+) com suporte em tabelas Delta e Iceberg. Isso melhora o desempenho da consulta sem alterações no código:
Fique ligado em nosso post de acompanhamento sobre o Variant, no qual apresentaremos exemplos práticos e compartilharemos histórias de clientes.
O foco em desempenho, simplicidade e valor é a base do Databricks SQL, onde o melhor data warehouse é um lakehouse. Para saber mais sobre o Databricks SQL, acesse nosso site, leia a documentação ou confira o tour pelo produto. O Databricks SQL é o data warehouse de alto desempenho, baixo custo e sem servidor — experimente gratuitamente hoje mesmo.
(This blog post has been translated using AI-powered tools) Original Post
Produto
June 11, 2024/11 min de leitura

