为什么ClickHouse客户端返回多个表?

时间:2019-03-22 15:20:37

标签: clickhouse

我对Clickhouse还是很陌生,我的第一次尝试似乎总是为SELECT生成这种输出:

:) select * from test

SELECT *
FROM test 

┌─s───┬───i─┐
│ foo │ 123 │
└─────┴─────┘
┌─s───┬───i─┐
│ bar │ 567 │
└─────┴─────┘

我希望这样:

┌─s───┬───i─┐
│ foo │ 123 │
│ bar │ 567 │
└─────┴─────┘

为什么我要分开行?是由表结构引起的吗?这是test表的结构:

CREATE TABLE test
(
    s String,
    i UInt64
) ENGINE = Memory

2 个答案:

答案 0 :(得分:1)

背景

ClickHouse具有矢量化查询执行引擎,这意味着在解释查询时,它会成批使用数据。批处理的定义与基础存储引擎密切相关。由于您使用的是 Memory 引擎,因此它会为每次插入制定批次(或使用 max_insert_block_size 设置将大插入分成单独的批次)。

答案

在查询输出中获得单独的表行的原因如下:

  • 您已经在 test 表中插入了两个块(两个 INSERT 语句),因此从其中进行扫描将生成两个块。

  • 您正在使用的查询不包含任何合并块的阻塞运算符(分组依据,排序依据等)。因此,生成的块将一一返回。

  • 命令行客户端在接收到块后立即打印它们。

答案 1 :(得分:1)

默认情况下,clickhouse-client 使用 PrettyCompact 输出格式:

<块引用>

非常紧凑

与 Pretty 的不同之处在于网格是在行和行之间绘制的 结果更紧凑。默认情况下使用此格式 交互模式下的命令行客户端。

如果你想加入所有的输出块,你可以使用稍微不同的输出格式PrettyCompactMonoBlock

<块引用>

PrettyCompactMonoBlock

与 PrettyCompact 的不同之处在于最多可缓冲 10,000 行, 然后输出为单个表,而不是按块输出。