Pular para o conteúdo principal
EntradaSaídaAlias

Descrição

Apache Avro é um formato de serialização orientado a linhas que usa codificação binária para o processamento eficiente de dados. O formato AvroConfluent oferece suporte à leitura e à gravação de mensagens codificadas em Avro usando o Confluent Schema Registry (ou serviços compatíveis com a API). Cada mensagem usa o wire format da Confluent: um byte mágico (0x00), seguido de um ID de schema de 4 bytes em big-endian e, em seguida, do datum binário Avro. Durante a leitura, o ClickHouse resolve o ID do schema consultando o registry. Durante a gravação, o ClickHouse registra o schema derivado das colunas de saída e prefixa cada linha com o ID resultante. Os schemas são armazenados em cache para garantir desempenho ideal.

Mapeamento de tipos de dados

A tabela abaixo mostra todos os tipos de dados compatíveis com o formato Apache Avro e seus respectivos tipos de dados no ClickHouse em consultas INSERT e SELECT.
Tipo de dado Avro INSERTTipo de dado ClickHouseTipo de dado Avro SELECT
boolean, int, long, float, doubleInt(8\16\32), UInt(8\16\32)int
boolean, int, long, float, doubleInt64, UInt64long
boolean, int, long, float, doubleFloat32float
boolean, int, long, float, doubleFloat64double
bytes, string, fixed, enumStringbytes ou string *
bytes, string, fixedFixedString(N)fixed(N)
enumEnum(8\16)enum
array(T)Array(T)array(T)
map(V, K)Map(V, K)map(string, K)
union(null, T), union(T, null)Nullable(T)union(null, T)
union(T1, T2, …) **Variant(T1, T2, …)union(T1, T2, …) **
nullNullable(Nothing)null
int (date) ***Date, Date32int (date) ***
long (timestamp-millis) ***DateTime64(3)long (timestamp-millis) ***
long (timestamp-micros) ***DateTime64(6)long (timestamp-micros) ***
bytes (decimal) ***DateTime64(N)bytes (decimal) ***
intIPv4int
fixed(16)IPv6fixed(16)
bytes (decimal) ***Decimal(P, S)bytes (decimal) ***
string (uuid) ***UUIDstring (uuid) ***
fixed(16)Int128/UInt128fixed(16)
fixed(32)Int256/UInt256fixed(32)
recordTuplerecord
** O tipo Variant aceita implicitamente null como valor de campo; assim, por exemplo, o Avro union(T1, T2, null) será convertido em Variant(T1, T2). Como resultado, ao gerar Avro a partir do ClickHouse, precisamos sempre incluir o tipo null no conjunto de tipos union do Avro, pois não sabemos, durante a inferência de esquema, se algum valor é de fato null. *** Tipos lógicos do Avro Tipos de dados lógicos do Avro não compatíveis:
  • time-millis
  • time-micros
  • duration

Configurações de formato

SettingDescriptionDefault
input_format_avro_allow_missing_fieldsSe deve usar um valor padrão em vez de gerar um erro quando um campo não é encontrado no schema.0
input_format_avro_null_as_defaultSe deve usar um valor padrão em vez de gerar um erro ao inserir um valor null em uma coluna que não é Nullable.0
format_avro_schema_registry_urlA URL do Confluent Schema Registry. Para autenticação básica, credenciais codificadas para URL podem ser incluídas diretamente no caminho da URL.
format_avro_schema_registry_connection_timeoutTempo limite de conexão, em segundos, para o cliente HTTP do Schema Registry (usado tanto para buscar schemas quanto para registrá-los). Deve ser maior que 0 e menor que 600 (10 minutos).1
format_avro_schema_registry_send_timeoutTempo limite de envio, em segundos, para o cliente HTTP do Schema Registry. Deve ser maior que 0 e menor que 600 (10 minutos).1
format_avro_schema_registry_receive_timeoutTempo limite de recebimento, em segundos, para o cliente HTTP do Schema Registry. Deve ser maior que 0 e menor que 600 (10 minutos).1
output_format_avro_confluent_subjectPara saída: o nome do subject sob o qual o schema é registrado no Schema Registry. Obrigatório ao gravar.
output_format_avro_string_column_patternPara saída: expressão regular das colunas String a serem serializadas como Avro string (o padrão é bytes).

Exemplos

Lendo do Kafka

Para ler um tópico do Kafka codificado em Avro usando o motor de tabela Kafka, use a configuração format_avro_schema_registry_url para informar a URL do schema registry.
CREATE TABLE topic1_stream
(
    field1 String,
    field2 String
)
ENGINE = Kafka()
SETTINGS
kafka_broker_list = 'kafka-broker',
kafka_topic_list = 'topic1',
kafka_group_name = 'group1',
kafka_format = 'AvroConfluent',
format_avro_schema_registry_url = 'http://schema-registry-url';

SELECT * FROM topic1_stream;

Gravando no Kafka

Para gravar mensagens AvroConfluent em um tópico do Kafka, defina a URL do schema registry e o nome do subject. O schema é registrado automaticamente no schema registry na primeira gravação.
CREATE TABLE topic1_sink
(
    field1 String,
    field2 String
)
ENGINE = Kafka()
SETTINGS
kafka_broker_list = 'kafka-broker',
kafka_topic_list = 'topic1',
kafka_format = 'AvroConfluent',
format_avro_schema_registry_url = 'http://schema-registry-url',
output_format_avro_confluent_subject = 'topic1-value';

INSERT INTO topic1_sink VALUES ('hello', 'world');

Usando autenticação básica

Se o seu schema registry exigir autenticação básica (por exemplo, se você estiver usando o Confluent Cloud), você pode fornecer credenciais codificadas em URL na configuração format_avro_schema_registry_url.
CREATE TABLE topic1_stream
(
    field1 String,
    field2 String
)
ENGINE = Kafka()
SETTINGS
kafka_broker_list = 'kafka-broker',
kafka_topic_list = 'topic1',
kafka_group_name = 'group1',
kafka_format = 'AvroConfluent',
format_avro_schema_registry_url = 'https://<username>:<password>@schema-registry-url';

Solução de problemas

Para monitorar o progresso da ingestão e depurar erros no consumer do Kafka, você pode consultar a tabela de sistema system.kafka_consumers. Se a sua implantação tiver várias réplicas (por exemplo, no ClickHouse Cloud), será necessário usar a função de tabela clusterAllReplicas.
SELECT * FROM clusterAllReplicas('default',system.kafka_consumers)
ORDER BY assignments.partition_id ASC;
Se você tiver problemas na resolução do schema, poderá usar kafkacat com clickhouse-local para diagnosticar o problema:
$ kafkacat -b kafka-broker  -C -t topic1 -o beginning -f '%s' -c 3 | clickhouse-local   --input-format AvroConfluent --format_avro_schema_registry_url 'http://schema-registry' -S "field1 Int64, field2 String"  -q 'select *  from table'
1 a
2 b
3 c
Última modificação em 10 de junho de 2026