Skip to content
ClickHouse Docs
ClickHouse DocsClickHouse Docs

ArrowStream

Entrada Saída Alias

Descrição

ArrowStream é o formato no "modo stream" do Apache Arrow. Ele foi projetado para processamento de streams em memória.

Exemplo de uso

No exemplo abaixo, usamos o conjunto de dados forex, que está disponível no playground SQL do ClickHouse. Você pode se conectar a ele remotamente com clickhouse-client usando o host sql-clickhouse.clickhouse.com e o usuário demo (que não tem senha). A tabela forex está no banco de dados forex, por isso o definimos como banco de dados padrão:

clickhouse-client --secure --host sql-clickhouse.clickhouse.com --user demo --database forex

A tabela forex armazena taxas de câmbio. Podemos verificar seu tamanho e o nível de compressão em disco consultando system.columns:

Querysql
SELECT
    table,
    formatReadableSize(sum(data_compressed_bytes)) AS compressed_size,
    formatReadableSize(sum(data_uncompressed_bytes)) AS uncompressed_size,
    sum(data_compressed_bytes) / sum(data_uncompressed_bytes) AS compression_ratio
FROM system.columns
WHERE (database = 'forex') AND (table = 'forex')
GROUP BY table
ORDER BY table ASC
Responseresponse
   ┌─table─┬─compressed_size─┬─uncompressed_size─┬───compression_ratio─┐
1. │ forex │ 63.69 GiB       │ 280.48 GiB        │ 0.22708227109363446 │
   └───────┴─────────────────┴───────────────────┴─────────────────────┘

Ao contrário do formato Arrow em "modo de arquivo", que exige o resultado completo antes de poder ser lido, ArrowStream é entregue como uma sequência de lotes de registros que um consumidor pode ler de forma incremental, à medida que chegam. Isso o torna ideal para transmitir o resultado de uma consulta diretamente para uma ferramenta de visualização ou analytics sem antes materializar todo o dataset.

Para transmitir o resultado, envie a consulta pela interface HTTP do ClickHouse com uma requisição POST e leia a resposta como um stream Arrow. Desabilitamos a compactação da saída Arrow por meio da configuração output_format_arrow_compression_method para que os consumidores possam decodificar os lotes diretamente à medida que os recebem.

A saída ArrowStream é binária bruta, portanto, em vez de imprimi-la no terminal, nós a redirecionamos para um consumidor. O stream é autodescritivo (carrega seu próprio esquema), então aqui o redirecionamos diretamente para o clickhouse-local, que lê os lotes recebidos com --input-format ArrowStream e faz consultas sobre eles como se fossem uma tabela. A tabela forex é grande, então restringimos a consulta remota com um predicado WHERE e um LIMIT para manter este exemplo pequeno:

curl "https://sql-clickhouse.clickhouse.com:8443/?user=demo&database=forex" \
    --data-binary "
        SELECT
            concat(base, '.', quote) AS base_quote,
            datetime AS last_update,
            CAST(bid, 'Float32') AS bid,
            CAST(ask, 'Float32') AS ask,
            ask - bid AS spread
        FROM forex
        WHERE base = 'USD' AND quote = 'CHF'
        ORDER BY datetime ASC
        LIMIT 5
        FORMAT ArrowStream
        SETTINGS output_format_arrow_compression_method='none'" \
  | clickhouse-local --input-format ArrowStream \
      --query "SELECT * FROM table ORDER BY last_update ASC FORMAT PrettyCompact"
Responseresponse
   ┌─base_quote─┬─────────────last_update─┬────bid─┬────ask─┬────────────────spread─┐
1. │ USD.CHF    │ 2000-05-30 17:23:44.000 │  1.688 │ 1.6885 │ 0.0005000829696655273 │
2. │ USD.CHF    │ 2000-05-30 17:23:46.000 │ 1.6885 │  1.689 │ 0.0004999637603759766 │
3. │ USD.CHF    │ 2000-05-30 17:23:48.000 │ 1.6886 │ 1.6891 │ 0.0005000829696655273 │
4. │ USD.CHF    │ 2000-05-30 17:23:49.000 │ 1.6888 │ 1.6893 │ 0.0004999637603759766 │
5. │ USD.CHF    │ 2000-05-30 17:24:45.000 │  1.689 │ 1.6895 │ 0.0004999637603759766 │
   └────────────┴─────────────────────────┴────────┴────────┴───────────────────────┘

O mesmo stream pode ser consumido de forma incremental por qualquer cliente compatível com Arrow, que o lê lote por lote, em vez de fazer a bufferização do resultado completo. Por exemplo, usando a biblioteca Apache Arrow para JavaScript, um RecordBatchReader retorna cada lote de registros assim que ele é transmitido pelo servidor:

const reader = await RecordBatchReader.from(response);
await reader.open();
for await (const recordBatch of reader) {
    const batchTable = new Table(recordBatch);
    const ipcStream = tableToIPC(batchTable, 'stream');
    const bytes = new Uint8Array(ipcStream);
    table.update(bytes);
}

Para um passo a passo completo de streaming de dados ArrowStream do ClickHouse para uma visualização em tempo real com Perspective, consulte a postagem do blog Streaming de visualizações em tempo real com ClickHouse, Apache Arrow e Perspective.

Configurações de formato

ArrowStream compartilha as mesmas configurações de formato do formato Arrow.

Configuração Descrição Padrão
input_format_arrow_allow_missing_columns Permite colunas ausentes ao ler formatos de entrada Arrow 1
input_format_arrow_case_insensitive_column_matching Ignora maiúsculas e minúsculas ao corresponder colunas Arrow com colunas CH. 0
input_format_arrow_import_nested Configuração obsoleta, não faz nada. 0
input_format_arrow_skip_columns_with_unsupported_types_in_schema_inference Ignora colunas com tipos não suportados durante a inferência de esquema do formato Arrow 0
output_format_arrow_compression_method Método de compactação do formato de saída Arrow. Codecs compatíveis: lz4_frame, zstd, none (sem compactação) lz4_frame
output_format_arrow_date_as_uint16 Grava valores Date como números simples de 16 bits (lidos de volta como UInt16), em vez de convertê-los para um tipo Arrow DATE32 de 32 bits (lido de volta como Date32). 0
output_format_arrow_fixed_string_as_fixed_byte_array Usa o tipo Arrow FIXED_SIZE_BINARY em vez de Binary para colunas FixedString. 1
output_format_arrow_low_cardinality_as_dictionary Habilita a saída do tipo LowCardinality como o tipo Arrow Dicionário 0
output_format_arrow_string_as_string Usa o tipo Arrow String em vez de Binary para colunas String 1
output_format_arrow_unsupported_types_as_binary Gera um tipo que não tem equivalente em Arrow (por exemplo, BFloat16, AggregateFunction) como dados binários brutos. Se for false, esse tipo gera uma exceção. 1
output_format_arrow_use_64_bit_indexes_for_dictionary Sempre usa inteiros de 64 bits para índices de dicionário no formato Arrow 0
output_format_arrow_use_signed_indexes_for_dictionary Usa inteiros com sinal para índices de dicionário no formato Arrow 1
Navigation