美文网首页ClickHouse中文社区
ClickHouse 数据格式介绍

ClickHouse 数据格式介绍

作者: c3729438b799 | 来源:发表于2017-11-27 23:19 被阅读3153次

    数据格式

    数据格式决定数据怎样被给定 (通过服务器写作为输出) 到你,在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

    This format is less efficient than the Native format, since it is row-based.

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

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

    相关文章

      网友评论

        本文标题:ClickHouse 数据格式介绍

        本文链接:https://www.haomeiwen.com/subject/lddjbxtx.html