【问题标题】:Why does ClickHouse client return multiple tables?为什么 ClickHouse 客户端返回多个表?
【发布时间】:2019-08-13 15:07:36
【问题描述】:

我对 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

【问题讨论】:

标签: clickhouse


【解决方案1】:

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

相当紧凑

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

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

PrettyCompactMonoBlock

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

【讨论】:

    【解决方案2】:

    背景

    ClickHouse 有一个矢量化查询执行引擎,这意味着在解释查询时,它会批量消费数据。批处理的定义与底层存储引擎密切相关。由于您使用的是 Memory 引擎,它会为每个插入制定批次(或根据 ma​​x_insert_block_size 设置将大插入拆分为单独的批次)。

    回答

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

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

      李>
    • 您使用的查询不包含任何合并块的阻塞运算符(分组依据、排序依据等)。所以生成的块会被一一返回。

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

    【讨论】:

    • 好像添加一个ORDER BY子句会强制服务器收集所有结果并形成一个单一的表结果。
    猜你喜欢
    • 1970-01-01
    • 2015-10-18
    • 2019-02-05
    • 1970-01-01
    • 2021-04-13
    • 2019-03-05
    • 2021-11-03
    • 2020-04-06
    • 2013-03-21
    相关资源
    最近更新 更多