ClickHouse 二进制格式介绍
发布于 6 个月前 作者 theseusyang 491 次浏览 来自 文档翻译

数据格式

数据格式决定数据怎样被给定 (通过服务器写作为输出) 到你,在SELECTs之后, 同时它怎样被接收 (通过服务器读作为输入) 对于INSERTs 操作.

BlockTabSeparated

数据不能被写通过行,只能通过列和数据块。每个数据块由部分列组成,每个数据块被写入到单独的行。这个值是 Tab 分隔的。一个列部分的最后的值跟着一个换行符,而不是 Tab 键。数据块通过一个 双换行符被分隔。规则剩下的部分与TabSeparated格式相同。此格式仅适合一个查询的输出,而不是解析。

CSV

Comma separated values (RFC).

字符串值是一个输出以双引号。在一个字符串中的双引号是一个输出,作为2个连续的 双引号。这是所有的转义规则。Date 和 DateTime值是输出以双引号。Numbers 没有引号输出。Fields通过逗号分隔。行通过unix newlines (LF)分隔。

数组有如下方法的输出:

数组序列化到字符串,然后字符串值是输出以 双引号。Tuples 是收窄的,是序列化的(作为单独的列)。

在解析过程中,值能够被附上或者以引号方式不被附上。同时支持单引或双引。特殊情况下,字符串能够被显示,不带引号 — 在这种情况下,他们被解析为逗号或newline (CR or LF)。与 RFC 相反,在解析字符串方面,首尾的空格和 Tab 键被忽略。在分隔符上,Unix (LF), Windows (CR LF) 或者 Mac OS Classic (LF CR)变量都被支持。

CSV 格式支持总输出,非常类似于TabSeparated格式。

CSVWithNames

也包含头, 类似TabSeparatedWithNames。

JSON

输出数据作为 JSON 格式。除了数据表之外,它也可以输出列名和类型,和一些额外的信息—如输入行的总大小,行的总数量,如果输出没有LIMIT关键字。例如:

SELECT SearchPhrase, count() AS c FROM test.hits GROUP BY SearchPhrase WITH TOTALS ORDER BY c DESC LIMIT 5 FORMAT JSON {“meta”:[{“name”:“SearchPhrase”,“type”:“String”},{“name”:“c”,“type”:“UInt64”}],“data”:[{“SearchPhrase”:"",“c”:“8267016”},{“SearchPhrase”:“интерьер ванной комнаты”,“c”:“2166”},{“SearchPhrase”:“яндекс”,“c”:“1655”},{“SearchPhrase”:“весна 2014 мода”,“c”:“1549”},{“SearchPhrase”:“фриформ фото”,“c”:“1480”}],“totals”:{“SearchPhrase”:"",“c”:“8873898”},“extremes”:{“min”:{“SearchPhrase”:"",“c”:“1480”},“max”:{“SearchPhrase”:"",“c”:“8267016”}},“rows”:5,“rows_before_limit_at_least”:141137}

JSON 与 JavaScript 兼容。对于这个目的,一些符号是额外转义符: 斜杠 / 被转义为 /; 替代换行为 U+2028 和 U+2029, 在一些浏览器上是不能用的, 被转义为 uXXXX-序列. ASCII 控制字符被转义: 分别为退格, form feed, line feed, carriage return, 和 水平 Tab 键 \b,\f,\n,\r, 和 \ 剩下的字节从 00-1F,使用 uXXXX-序列. 无效的 UTF-8 序列 被更改为替换字符�, 输出文本由有效的UTF-8 序列组成. UInt64 和 Int64 数字是以 双引号作为输出,与 JavaScript 兼容。

rows- 输出行的总大小.

rows_before_limit_at_least- 行的最小数没有 LIMIT 关键字。查询中不包含 LIMIT。

如果查询包含 GROUP BY,rows_before_limit_at_least 将是没有LIMIT条件的准确行数。

totals- 总值 (当使用 WITH TOTALS 时)。

extremes- 极限值 (当极限值设置为 1).

此格式是仅适用于 输出一个查询结果, 并不是为了解析. 查看 JSONEachRow 格式, 为了插入 INSERT 查询。

JSONCompact

区别于 JSON ,仅在数据行中以数组的形式输出,不以对象(objects)的形式。

{

“meta”:

[

{

“name”: “SearchPhrase”,

“type”: “String”

},

{

“name”: “c”,

“type”: “UInt64”

}

],

“data”:

[

["", “8267016”],

[“bath interiors”, “2166”],

[“yandex”, “1655”],

[“spring 2014 fashion”, “1549”],

[“freeform photo”, “1480”]

],

“totals”: ["",“8873898”],

“extremes”:

{

“min”: ["",“1480”],

“max”: ["",“8267016”]

},

“rows”: 5,

“rows_before_limit_at_least”: 141137

}

此格式仅适用于输出一个查询结果,并不为了解析。对于INSERT查询请查看JSONEachRowformat。

JSONEachRow

如果放在SELECT查询中,在换行符的 JSON 中显示数据(JSON 对象由 \n进行分隔)。如果放在INSERT查询中,期望这种数据类型作为输入。

{“SearchPhrase”:"",“count()”:“8267016”}

{“SearchPhrase”:“bathroom interior”,“count()”:“2166”}

{“SearchPhrase”:“yandex”,“count()”:“1655”}

{“SearchPhrase”:“spring 2014 fashion”,“count()”:“1549”}

{“SearchPhrase”:“free-form photo”,“count()”:“1480”}

{“SearchPhrase”:“Angelina Jolie”,“count()”:“1245”}

{“SearchPhrase”:“omsk”,“count()”:“1112”}

{“SearchPhrase”:“photos of dog breeds”,“count()”:“1091”}

{“SearchPhrase”:“curtain design”,“count()”:“1064”}

{“SearchPhrase”:“baku”,“count()”:“1000”}

不像 JSON 格式,没有替换无效的UTF-8序列。在行中有任意的字节数。在格式化的时候,避免数据丢失。值被显示类似于 JSON 格式。

在INSERT查询中,JSON 数据以任意的列顺序(JSON 键值对儿)。当此列的默认值被插入时,也有可能忽略这个值。当使用JSONEachRow格式时,复杂的默认值并没有提供,当忽略一个列时,它的值将是0,或者是依赖它的类型的空字符串。

在 JSON 对象的空格被跳过。在对象之间,有逗号被忽略。对于 Objects,Newline字符串不是一个强制分隔符。

Native

最有效的格式。以二进制的格式,通过数据块数据被写入和读取。对于每个数据块,行数,列数,列名称和类型,数据块中列的部分一个一个被记录。换句话说,此格式是“columnar” — 它不能转换列到行。这是一个格式被用于本地接口,在服务器之间交互,对于使用命令行和C++的客户端。

你能够使用这个格式快速生成 dump 文件,dump文件仅通过ClickHouse DBMS被读取。它并不与格式本身进行交互。

Null

没有输出。然后,查询是被处理的,当使用命令行客户端时,数据被传输到客户端。这个被用于测试,包括生产级测试环境。很明显,此格式仅适合输出一个查询结果,而不是解析。

Pretty

写数据作为一个Unicode表,也使用ANSI序列,在终端设置颜色。一个表的格被画出来,每个行在终端有2行。每个结果数据块作为一个单独的表输出。数据块是输出,没有缓冲结果(缓冲在预计算所有值的可见宽度是有用的),为了避免在终端 dump 太多的数据,只有最初的10000行被打印出来。如果数据的行数大于10,000,则将打印出显示最初的10000行。此格式仅适合输出一个查询结果,而不是解析。

Pretty格式支持输出总的值(当使用WITH TOTALS )和极值(‘extremes’ 设置为 1)。在这种情况下,总值和极值在主数据之后输出,在单独的表中。显示PrettyCompact格式:

SELECT EventDate,count() AS c FROM test.hits GROUP BY EventDate WITH TOTALS ORDER BY EventDate FORMAT PrettyCompact ┌──EventDate─┬───────c─┐

│ 2014-03-17 │ 1406958 │

│ 2014-03-18 │ 1383658 │

│ 2014-03-19 │ 1405797 │

│ 2014-03-20 │ 1353623 │

│ 2014-03-21 │ 1245779 │

│ 2014-03-22 │ 1031592 │

│ 2014-03-23 │ 1046491 │

└────────────┴─────────┘

Totals:

┌──EventDate─┬───────c─┐

│ 0000-00-00 │ 8873898 │

└────────────┴─────────┘

Extremes:

┌──EventDate─┬───────c─┐

│ 2014-03-17 │ 1031592 │

│ 2014-03-23 │ 1406958 │

└────────────┴─────────┘

PrettyCompact

区别于Pretty, grid 是在行和结果之间画出的,是进一步压缩的。此格式被用于在命令行的客户端,以交互的模式。

PrettyCompactMonoBlock

有别于PrettyCompact,上到10000行被缓冲起来。然后输出作为一个单行,不是通过数据块。

PrettyNoEscapes

有别于Pretty在ANSI序列上没有使用。对于在浏览器中显示这个格式,它是必要的,同时使用’watch’命令行工具。

例如:

watch -n1 "clickhouse-client --query=‘SELECT * FROM system.events FORMAT PrettyCompactNoEscapes’" 你能够使用HTTP接口,显示在浏览器中。

PrettyCompactNoEscapes

相同.

PrettySpaceNoEscapes

相同.

PrettySpace

与PrettyCompact有区别,被使用替代 grid:

RowBinary

在二进制格式中通过行写入数据。行和值顺序被列出,不需要分割符。此格式不如 Native 格式高效,它是基于行的。

Numbers以从小到大的方式被写,确定的长度。例如UInt64花费8字节。DateTime被写UInt32,带有unix时间戳。Date 被写入以 UInt16的方式,日期值是从1970-01-01开始。字符串被写入长度是LEB128格式,然后是字符串字节。FixedString被写入作为它的字节。数组被写入以LEB128格式,所有的元素都是顺序的。

回到顶部