spark_catalog, e as tabelas são identificadas por {catalog name}.{database}.{table}. Com o novo
recurso de catálogo, agora é possível adicionar e trabalhar com vários catálogos em uma única aplicação Spark.
Escolhendo entre a Catalog API e a TableProvider API
Catalog API vs TableProvider API
Requisitos
- Java 8 ou 17 (Java 17+ é necessário para o Spark 4.0)
- Scala 2.12 ou 2.13 (o Spark 4.0 oferece suporte somente ao Scala 2.13)
- Apache Spark 3.3, 3.4, 3.5 ou 4.0
Matriz de compatibilidade
Instalação e configuração
pom.xml
para Maven ou build.sbt para SBT).
Como alternativa, você pode colocar os arquivos JAR necessários na pasta $SPARK_HOME/jars/ ou passá-los diretamente como uma
opção do Spark usando a flag --jars no comando spark-submit.
Ambas as abordagens garantem que o conector do ClickHouse esteja disponível no seu ambiente Spark.
Importar como dependência
- Maven
- Gradle
- SBT
- Spark SQL/Shell CLI
Baixe a biblioteca
Registrar o catálogo (obrigatório)
Essas configurações podem ser definidas de uma das seguintes maneiras:
- Editar/criar
spark-defaults.conf. - Passar a configuração para o comando
spark-submit(ou para os comandos CLIspark-shell/spark-sql). - Adicionar a configuração ao inicializar seu contexto.
Usando a TableProvider API (Acesso baseado em formato)
Exemplo de leitura com base em formato
- Python
- Scala
- Java
Exemplo de gravação baseado em formato
- Python
- Scala
- Java
Recursos do TableProvider
Criação automática de tabela
- Engine: Usa
MergeTree()por padrão, se nenhum for especificado. Você pode especificar um engine diferente usando a opçãoengine(por exemplo,ReplacingMergeTree(),SummingMergeTree(), etc.) - ORDER BY: Obrigatório - Você deve especificar explicitamente a opção
order_byao criar uma nova tabela. O conector valida se todas as colunas especificadas existem no esquema. - Suporte a chave Nullable: Adiciona automaticamente
settings.allow_nullable_key=1se o ORDER BY contiver colunas Nullable
- Python
- Scala
- Java
Opções de conexão do TableProvider
Opções de conexão
Opções de criação de tabela
- A opção
order_byé obrigatória ao criar uma nova tabela. Todas as colunas especificadas devem existir no esquema. ** Definido automaticamente como1se o ORDER BY contiver colunas Nullable e não for fornecido explicitamente.
Modos de gravação
append: Adiciona dados à tabela existenteoverwrite: Substitui todos os dados da tabela (trunca a tabela)
- Python
- Scala
- Java
Configurando opções do ClickHouse
allow_nullable_key, index_granularity e outras configurações no nível da tabela ou da consulta. Elas são diferentes das opções do conector (como host, database, table), que controlam como o conector se conecta ao ClickHouse.
Usando a TableProvider API
settings.<key>:
- Python
- Scala
- Java
Usando a Catalog API
spark.sql.catalog.<catalog_name>.option.<key> na configuração do Spark:
Configurações do ClickHouse Cloud
Ler dados
- Java
- Scala
- Python
- Spark SQL
Gravar dados
- Java
- Scala
- Python
- Spark SQL
Operações DDL
Ao usar o Spark SQL, apenas uma instrução pode ser executada por vez.
Trabalhando com VariantType
O suporte a VariantType está disponível no Spark 4.0+ e requer o ClickHouse 25.3+ com os tipos JSON/Variant experimentais habilitados.
VariantType do Spark para trabalhar com dados semiestruturados. O VariantType é mapeado para os tipos JSON e Variant do ClickHouse, permitindo armazenar e consultar com eficiência dados com esquema flexível.
Esta seção se concentra especificamente no mapeamento e uso do VariantType. Para uma visão geral completa de todos os tipos de dados compatíveis, consulte a seção Tipos de dados compatíveis.
Mapeamento de tipos do ClickHouse
Lendo dados do VariantType
JSON e Variant são mapeadas automaticamente para o VariantType do Spark:
- Scala
- Python
- Java
Gravando dados VariantType
- Scala
- Python
- Java
Criando tabelas do tipo VariantType com Spark SQL
Configurando os tipos Variant
VariantType, você pode especificar quais tipos do ClickHouse devem ser usados:
Tipo JSON (padrão)
variant_types for especificada, a coluna usará, por padrão, o tipo JSON do ClickHouse, que aceita apenas objetos JSON:
Tipo Variant com múltiplos tipos
variant_types:
Tipos de Variant compatíveis
Variant():
- Primitivos:
String,Int8,Int16,Int32,Int64,UInt8,UInt16,UInt32,UInt64,Float32,Float64,Bool - Arrays:
Array(T), em que T é qualquer tipo compatível, incluindo arrays aninhados - JSON:
JSONpara armazenar objetos JSON
Configuração do formato de leitura
VariantType. Você pode alterar esse comportamento para lê-las como strings:
- Scala
- Python
- Java
Suporte ao formato de gravação
Configure o formato de gravação:
Melhores práticas
- Use o tipo JSON para dados exclusivamente em JSON: Se você armazena apenas objetos JSON, use o tipo JSON padrão (sem a propriedade
variant_types) - Especifique os tipos explicitamente: Ao usar
Variant(), liste explicitamente todos os tipos que você pretende armazenar - Habilite recursos experimentais: Verifique se o ClickHouse está com
allow_experimental_json_type = 1habilitado - Use o formato JSON para escritas: O formato JSON é recomendado para dados do VariantType, por oferecer melhor compatibilidade
- Considere os padrões de consulta: Os tipos JSON/Variant oferecem suporte às consultas de caminho JSON do ClickHouse para uma filtragem eficiente
- Column hints para desempenho: Ao usar campos JSON no ClickHouse, adicionar column hints melhora o desempenho da consulta. No momento, não há suporte para adicionar column hints via Spark. Consulte a GitHub issue #497 para acompanhar esse recurso.
Exemplo: Fluxo de trabalho completo
- Scala
- Python
- Java
Configurações
Uso das configurações: estas são opções de configuração no nível do Spark que se aplicam tanto à Catalog API quanto à TableProvider API. Elas podem ser definidas de duas formas:
-
Configuração global do Spark (aplica-se a todas as operações):
-
Substituição por operação (somente na TableProvider API — pode sobrescrever as configurações globais):
spark-defaults.conf ou ao criar a sessão do Spark.