2020-12-21 10:31:32 +00:00
---
toc_priority: 21
toc_title: 输入/输出格式
---
# 输入/输出格式 {#formats}
ClickHouse可以接受和返回各种格式的数据。输入支持的格式可以用来解析提供给`INSERT`的数据,可以从文件备份表(如File, URL或HDFS)执行`SELECT`,或者读取外部字典。输出支持的格式可用于获取`SELECT`的结果,并支持执行`INSERT`文件的表中。
以下是支持的格式:
| 格式 | 输入 | 输出 |
|-----------------------------------------------------------------------------------------|-------|--------|
| [TabSeparated ](#tabseparated ) | ✔ | ✔ |
| [TabSeparatedRaw ](#tabseparatedraw ) | ✔ | ✔ |
| [TabSeparatedWithNames ](#tabseparatedwithnames ) | ✔ | ✔ |
| [TabSeparatedWithNamesAndTypes ](#tabseparatedwithnamesandtypes ) | ✔ | ✔ |
| [Template ](#format-template ) | ✔ | ✔ |
| [TemplateIgnoreSpaces ](#templateignorespaces ) | ✔ | ✗ |
| [CSV ](#csv ) | ✔ | ✔ |
| [CSVWithNames ](#csvwithnames ) | ✔ | ✔ |
| [CustomSeparated ](#format-customseparated ) | ✔ | ✔ |
| [Values ](#data-format-values ) | ✔ | ✔ |
| [Vertical ](#vertical ) | ✗ | ✔ |
| [VerticalRaw ](#verticalraw ) | ✗ | ✔ |
| [JSON ](#json ) | ✗ | ✔ |
| [JSONAsString ](#jsonasstring ) | ✔ | ✗ |
| [JSONString ](#jsonstring ) | ✗ | ✔ |
| [JSONCompact ](#jsoncompact ) | ✗ | ✔ |
| [JSONCompactString ](#jsoncompactstring ) | ✗ | ✔ |
| [JSONEachRow ](#jsoneachrow ) | ✔ | ✔ |
| [JSONEachRowWithProgress ](#jsoneachrowwithprogress ) | ✗ | ✔ |
| [JSONStringEachRow ](#jsonstringeachrow ) | ✔ | ✔ |
| [JSONStringEachRowWithProgress ](#jsonstringeachrowwithprogress ) | ✗ | ✔ |
| [JSONCompactEachRow ](#jsoncompacteachrow ) | ✔ | ✔ |
| [JSONCompactEachRowWithNamesAndTypes ](#jsoncompacteachrowwithnamesandtypes ) | ✔ | ✔ |
| [JSONCompactStringEachRow ](#jsoncompactstringeachrow ) | ✔ | ✔ |
| [JSONCompactStringEachRowWithNamesAndTypes ](#jsoncompactstringeachrowwithnamesandtypes ) | ✔ | ✔ |
| [TSKV ](#tskv ) | ✔ | ✔ |
| [Pretty ](#pretty ) | ✗ | ✔ |
| [PrettyCompact ](#prettycompact ) | ✗ | ✔ |
| [PrettyCompactMonoBlock ](#prettycompactmonoblock ) | ✗ | ✔ |
| [PrettyNoEscapes ](#prettynoescapes ) | ✗ | ✔ |
| [PrettySpace ](#prettyspace ) | ✗ | ✔ |
| [Protobuf ](#protobuf ) | ✔ | ✔ |
| [ProtobufSingle ](#protobufsingle ) | ✔ | ✔ |
| [Avro ](#data-format-avro ) | ✔ | ✔ |
| [AvroConfluent ](#data-format-avro-confluent ) | ✔ | ✗ |
| [Parquet ](#data-format-parquet ) | ✔ | ✔ |
| [Arrow ](#data-format-arrow ) | ✔ | ✔ |
| [ArrowStream ](#data-format-arrow-stream ) | ✔ | ✔ |
| [ORC ](#data-format-orc ) | ✔ | ✗ |
| [RowBinary ](#rowbinary ) | ✔ | ✔ |
| [RowBinaryWithNamesAndTypes ](#rowbinarywithnamesandtypes ) | ✔ | ✔ |
| [Native ](#native ) | ✔ | ✔ |
| [Null ](#null ) | ✗ | ✔ |
| [XML ](#xml ) | ✗ | ✔ |
| [CapnProto ](#capnproto ) | ✔ | ✗ |
| [LineAsString ](#lineasstring ) | ✔ | ✗ |
您可以使用ClickHouse设置控制一些格式处理参数。更多详情设置请参考[设置](../operations/settings/settings.md)
2018-10-16 06:58:03 +00:00
2018-12-21 19:23:55 +00:00
## TabSeparated {#tabseparated}
2018-10-16 06:58:03 +00:00
2020-12-21 10:31:32 +00:00
在TabSeparated分隔格式中, 数据按行写入。每行包含由制表符分隔的值。每个值后跟一个制表符, 除了行中最后一个值后跟换行。在任何地方都采用严格的Unix换行。最后一行还必须在末尾包含换行。值以文本格式编写, 不包含引号, 并使用转义的特殊字符。
2018-10-16 06:58:03 +00:00
2020-12-21 10:31:32 +00:00
这种格式也可以用`TSV`来表示。
2018-10-16 06:58:03 +00:00
2020-12-21 10:31:32 +00:00
`TabSeparated` 格式便于使用自定义程序和脚本处理数据。默认情况下, 它在HTTP接口和命令行客户端的批处理模式中使用。这种格式还允许在不同dbms之间传输数据。例如, 您可以从MySQL获取转储并将其上传到ClickHouse, 反之亦然。
2018-10-16 10:47:17 +00:00
2020-12-21 10:31:32 +00:00
`TabSeparated` 格式支持输出total值(与TOTALS一起使用时)和extreme值(当`extreme`被设置为1时)。在这种情况下, total值和extreme值会在主数据后输出。主要结果、总值和极值之间用空行分隔。示例:
2018-10-16 10:47:17 +00:00
``` sql
SELECT EventDate, count() AS c FROM test.hits GROUP BY EventDate WITH TOTALS ORDER BY EventDate FORMAT TabSeparated``
2018-10-16 06:58:03 +00:00
```
2020-12-21 10:31:32 +00:00
``` text
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
1970-01-01 8873898
2014-03-17 1031592
2014-03-23 1406958
```
### 数据格式化 {#data-formatting}
2020-03-20 18:20:59 +00:00
2020-12-21 10:31:32 +00:00
整数是用十进制形式写的。数字可以在开头包含一个额外的`+`字符(解析时忽略,格式化时不记录)。非负数不能包含负号。在读取时,允许将空字符串解析为零,或者(对于有符号类型)将仅由一个负号组成的字符串解析为零。不符合相应数据类型的数字可以被解析为不同的数字,而不会出现错误消息。
2020-03-20 18:20:59 +00:00
2020-12-21 10:31:32 +00:00
浮点数以十进制形式书写。`.`号用作十进制分隔符。支持指数符号,如`inf`、`+inf`、`-inf`和`nan`。浮点数的条目可以以小数点开始或结束。
在格式化期间,浮点数可能会丢失准确性。
在解析期间,并不严格要求读取与机器可以表示的最接近的数值。
2018-10-16 10:47:17 +00:00
2020-12-21 10:31:32 +00:00
日期以YYYY-MM-DD格式编写, 并以相同的格式解析, 但使用任何字符作为分隔符。
日期和时间以`YYYY-MM-DD hh:mm:ss`的格式书写,并以相同的格式解析,但使用任何字符作为分隔符。
这一切都发生在客户端或服务器启动时的系统时区(取决于它们对数据的格式)。对于带有时间的日期,夏时制时间未指定。因此,如果转储在夏令时有时间,则转储不会明确地与数据匹配,解析将选择这两次中的一次。
在读取操作期间, 不正确的日期和具有时间的日期可以使用自然溢出或null日期和时间进行分析, 而不会出现错误消息。
2018-10-16 10:47:17 +00:00
2020-12-21 10:31:32 +00:00
有个例外情况, Unix时间戳格式也支持用时间解析日期(如果它恰好由10个十进制数字组成)。其结果与时间区域无关。格式`YYYY-MM-DD hh:mm:ss`和`NNNNNNNNNN`是自动区分的。
2018-10-16 10:47:17 +00:00
2020-12-21 10:31:32 +00:00
字符串以反斜杠转义的特殊字符输出。下面的转义序列用于输出:`\b`, ` \f`, ` \r`, ` \n`, ` \t`, ` \0`, ` \'`, ` \\`。解析还支持` \a`、` \v`和` \xHH`(十六进制转义字符)和任何`\c`字符,其中` c`是任何字符(这些序列被转换为`c`)。因此,读取数据支持这样一种格式,即可以将换行符写成`\n`或` \`,或者写成换行符。例如,字符串`Hello world`在单词之间有换行符,而不是空格,可以用以下语法进行解析:
2018-10-16 10:47:17 +00:00
2020-12-21 10:31:32 +00:00
``` text
Hello\nworld
Hello\
world
```
2018-10-16 10:47:17 +00:00
2020-12-21 10:31:32 +00:00
第二种形式是支持的, 因为MySQL读取tab-separated格式数据集的时候也会使用它。
2018-10-16 10:47:17 +00:00
2020-12-21 10:31:32 +00:00
在TabSeparated分隔格式传递数据时需要转义的最小字符集:`Tab`、换行符(LF)和反斜杠。
2018-10-16 10:47:17 +00:00
2020-12-21 10:31:32 +00:00
只有一小部分符号被转义。您可以很容易地找到一个字符串值,而您的终端将在输出中不显示它。
2018-10-16 06:58:03 +00:00
2020-12-21 10:31:32 +00:00
数组写在方括号内的逗号分隔值列表中。数组中的数字项按正常格式进行格式化。`Date`和`DateTime`类型用单引号表示。字符串使用与上面相同的转义规则在单引号中编写。
2018-10-16 06:58:03 +00:00
2020-12-21 10:31:32 +00:00
[NULL ](../sql-reference/syntax.md )将输出为`\N`。
2018-10-16 10:47:17 +00:00
2020-12-21 10:31:32 +00:00
[Nested ](../sql-reference/data-types/nested-data-structures/nested.md )结构的每个元素都表示为数组。
示例:
``` sql
CREATE TABLE nestedt
(
`id` UInt8,
`aux` Nested(
a UInt8,
b String
)
)
ENGINE = TinyLog
```
2018-10-16 10:47:17 +00:00
2020-12-21 10:31:32 +00:00
``` sql
INSERT INTO nestedt Values ( 1, [1], ['a'])
```
2018-10-16 10:47:17 +00:00
2020-12-21 10:31:32 +00:00
``` sql
SELECT * FROM nestedt FORMAT TSV
```
2018-10-16 10:47:17 +00:00
2020-12-21 10:31:32 +00:00
``` text
1 [1] ['a']
```
2018-10-16 10:47:17 +00:00
2018-12-21 19:23:55 +00:00
## TabSeparatedRaw {#tabseparatedraw}
2018-10-16 10:47:17 +00:00
2020-12-21 10:31:32 +00:00
与`TabSeparated`格式的不同之处在于,写入的行没有转义。
使用这种格式解析时,每个字段中不允许使用制表符或换行符。
2018-10-16 10:47:17 +00:00
2020-12-21 10:31:32 +00:00
这种格式也可以使用名称`TSVRaw`来表示。
2018-10-16 10:47:17 +00:00
2018-12-21 19:23:55 +00:00
## TabSeparatedWithNames {#tabseparatedwithnames}
2018-10-16 10:47:17 +00:00
2020-12-21 10:31:32 +00:00
与`TabSeparated`格式不同的是列名写在第一行。
在解析过程中,第一行被完全忽略。不能使用列名来确定它们的位置或检查它们的正确性。
(将来可能会添加对头行解析的支持。)
2018-10-16 10:47:17 +00:00
2020-12-21 10:31:32 +00:00
这种格式也可以使用名称`TSVWithNames`来表示。
2018-10-16 10:47:17 +00:00
2018-12-21 19:23:55 +00:00
## TabSeparatedWithNamesAndTypes {#tabseparatedwithnamesandtypes}
2018-10-16 10:47:17 +00:00
2020-12-21 10:31:32 +00:00
与`TabSeparated`格式不同的是列名写在第一行,而列类型写在第二行。
在解析过程中,将完全忽略第一行和第二行。
2018-10-16 10:47:17 +00:00
2020-12-21 10:31:32 +00:00
这种格式也可以使用名称`TSVWithNamesAndTypes`来表示。
2018-10-16 10:47:17 +00:00
2020-12-21 10:31:32 +00:00
## Template {#format-template}
2019-09-06 09:07:23 +00:00
2020-12-21 10:31:32 +00:00
此格式允许指定带有占位符的自定义格式字符串,这些占位符用于指定转义规则。
2019-09-06 09:07:23 +00:00
2020-12-21 10:31:32 +00:00
它使用设置`format_schema`, `format_schema_rows` , `format_schema_rows_between_delimiter` 以及其他格式的一些设置(例如转义`JSON`时使用`output_format_json_quote_64bit_integers`)
2019-09-06 09:07:23 +00:00
2020-12-21 10:31:32 +00:00
设置`format_template_row`指定文件的路径,该文件包含以下语法的行格式字符串:
2019-09-06 09:07:23 +00:00
2020-03-20 18:20:59 +00:00
`delimiter_1${column_1:serializeAs_1}delimiter_2${column_2:serializeAs_2} ... delimiter_N` ,
2019-09-06 09:07:23 +00:00
2020-12-21 10:31:32 +00:00
其中,`delimiter_i`是值之间的分隔符(`$`符号可以转义为`$$`),
`column_i` 是要选择或插入其值的列的名称或索引(如果为空,则跳过该列),
`serializeAs_i` 是列值的转义规则。支持以下转义规则:
2020-02-22 17:20:17 +00:00
2020-12-21 10:31:32 +00:00
- `CSV` , `JSON` , `XML` (类似于相同名称的格式)
- `Escaped` (类似于`TSV`)
- `Quoted` (类似于`Values`)
- `Raw` (类似于`TSVRaw`)
- `None`
2020-02-22 17:20:17 +00:00
2020-12-21 10:31:32 +00:00
如果省略了转义规则,那么将使用`None`。`XML`和`Raw`只适用于输出。
2020-02-22 17:20:17 +00:00
2020-12-21 10:31:32 +00:00
对于下面的格式字符串:
2020-02-22 17:20:17 +00:00
2020-03-21 04:11:51 +00:00
`Search phrase: ${SearchPhrase:Quoted}, count: ${c:Escaped}, ad price: $$${price:JSON};`
2020-02-22 17:20:17 +00:00
2020-12-21 10:31:32 +00:00
`SearchPhrase` 、`c`和`price`列的值被转义为`quotation`、`Escaped`和`JSON`将分别在`Search phrase:`, `, count: ` , `, ad price: $` 和`;`分隔符之间打印(用于选择)或expected(用于插入)。例如:
2019-09-06 09:07:23 +00:00
2020-12-21 10:31:32 +00:00
`Search phrase: 'bathroom interior design', count: 2166, ad price: $3;`
2020-02-22 17:20:17 +00:00
2020-12-21 10:31:32 +00:00
`format_template_rows_between_delimiter` 设置指定行之间的分隔符,它将打印(或expected)在每一行之后,最后一行除外(默认为`\n`)。
2019-09-06 09:07:23 +00:00
2020-12-21 10:31:32 +00:00
设置`format_template_resultset`指定文件路径, 该文件包含resultset的格式字符串。resultset的格式字符串与row的格式字符串具有相同的语法, 允许指定前缀、后缀和打印一些附加信息的方法。它包含以下占位符而不是列名:
2019-09-06 09:07:23 +00:00
2020-12-21 10:31:32 +00:00
- `data` `format_template_row` 格式的数据行,由`format_template_rows_between_delimiter`分隔。此占位符必须是格式字符串中的第一个占位符。
- `totals` `format_template_row` 格式的总值(和WITH TOTALS一起使用)
- `min` `format_template_row` 格式的最小值(当极值设置为1时)
- `max` `format_template_row` 格式的最大值(当极值设置为1时)
- `rows` 输出行的总数
- `rows_before_limit` 没有LIMIT的最小行数。仅当查询包含LIMIT时输出。如果查询包含GROUP BY, 那么rows_before_limit_at_least就是没有LIMIT的确切行数。
- `time` 请求执行时间(秒)
2020-04-08 14:22:25 +00:00
- `rows_read` 已读取的行数
2020-12-21 10:31:32 +00:00
- `bytes_read` 已读取(未压缩)的字节数
2020-03-20 18:20:59 +00:00
2020-12-21 10:31:32 +00:00
占位符`data`、`totals`、`min`和`max`必须没有指定转义规则(或者必须显式指定`None`)。其余占位符可以指定任何转义规则。
如果`format_template_resultset`设置为空字符串,则使用`${data}`作为默认值。
对于insert查询, 格式允许跳过某些列或某些字段的前缀或后缀(参见示例)。
2020-03-20 18:20:59 +00:00
2020-12-21 10:31:32 +00:00
Select示例:
2020-03-20 18:20:59 +00:00
``` sql
2020-12-21 10:31:32 +00:00
SELECT SearchPhrase, count() AS c FROM test.hits GROUP BY SearchPhrase ORDER BY c DESC LIMIT 5 FORMAT Template SETTINGS
format_template_resultset = '/some/path/resultset.format', format_template_row = '/some/path/row.format', format_template_rows_between_delimiter = '\n '
```
`/some/path/resultset.format` :
``` text
<!DOCTYPE HTML>
2019-09-06 09:07:23 +00:00
< html > < head > < title > Search phrases< / title > < / head >
< body >
< table border = "1" > < caption > Search phrases< / caption >
< tr > < th > Search phrase< / th > < th > Count< / th > < / tr >
${data}
< / table >
< table border = "1" > < caption > Max< / caption >
${max}
< / table >
< b > Processed ${rows_read:XML} rows in ${time:XML} sec< / b >
< / body >
2020-12-21 10:31:32 +00:00
< / html >
```
`/some/path/row.format` :
``` text
< tr > < td > ${0:XML}< / td > < td > ${1:XML}< / td > < / tr >
2019-09-06 09:07:23 +00:00
```
2020-03-20 18:20:59 +00:00
2020-12-21 10:31:32 +00:00
结果:
2020-03-20 18:20:59 +00:00
``` html
2019-09-06 09:07:23 +00:00
<!DOCTYPE HTML>
< html > < head > < title > Search phrases< / title > < / head >
< body >
< table border = "1" > < caption > Search phrases< / caption >
< tr > < th > Search phrase< / th > < th > Count< / th > < / tr >
< tr > < td > < / td > < td > 8267016< / td > < / tr >
< tr > < td > bathroom interior design< / td > < td > 2166< / td > < / tr >
< tr > < td > yandex< / td > < td > 1655< / td > < / tr >
< tr > < td > spring 2014 fashion< / td > < td > 1549< / td > < / tr >
< tr > < td > freeform photos< / td > < td > 1480< / td > < / tr >
< / table >
< table border = "1" > < caption > Max< / caption >
< tr > < td > < / td > < td > 8873898< / td > < / tr >
< / table >
< b > Processed 3095973 rows in 0.1569913 sec< / b >
< / body >
< / html >
```
2020-12-21 10:31:32 +00:00
Insert示例:
2020-03-20 18:20:59 +00:00
2020-12-21 10:31:32 +00:00
``` text
Some header
Page views: 5, User id: 4324182021466249494, Useless field: hello, Duration: 146, Sign: -1
Page views: 6, User id: 4324182021466249494, Useless field: world, Duration: 185, Sign: 1
Total rows: 2
```
2020-03-20 18:20:59 +00:00
``` sql
2020-02-22 17:20:17 +00:00
INSERT INTO UserActivity FORMAT Template SETTINGS
2020-12-21 10:31:32 +00:00
format_template_resultset = '/some/path/resultset.format', format_template_row = '/some/path/row.format'
```
`/some/path/resultset.format` :
``` text
Some header\n${data}\nTotal rows: ${:CSV}\n
```
`/some/path/row.format` :
``` text
Page views: ${PageViews:CSV}, User id: ${UserID:CSV}, Useless field: ${:CSV}, Duration: ${Duration:CSV}, Sign: ${Sign:CSV}
2019-09-06 09:07:23 +00:00
```
2020-03-20 18:20:59 +00:00
2020-12-21 10:31:32 +00:00
`PageViews` , `UserID` , `Duration` 和`Sign` 内部占位符是表中列的名称。将忽略行中`Useless field`后面和后缀中`\nTotal rows:`之后的值。
2020-04-08 14:22:25 +00:00
输入数据中的所有分隔符必须严格等于指定格式字符串中的分隔符。
2020-02-22 17:20:17 +00:00
2019-09-06 09:07:23 +00:00
## TemplateIgnoreSpaces {#templateignorespaces}
2020-12-21 10:31:32 +00:00
这种格式只适用于输入。
类似于`Template`,但跳过输入流中分隔符和值之间的空白字符。但是,如果格式字符串包含空格字符,这些字符将会出现在输入流中。还允许指定空占位符(`${}`或`${:None}`)来将一些分隔符分割为单独的部分,以忽略它们之间的空格。这种占位符仅用于跳过空白字符。
如果列的值在所有行的顺序相同,那么可以使用这种格式读取`JSON`。可以使用以下请求从格式为[JSON](#json)的输出示例中插入数据:
2020-03-20 18:20:59 +00:00
``` sql
2019-09-06 09:07:23 +00:00
INSERT INTO table_name FORMAT TemplateIgnoreSpaces SETTINGS
2020-12-21 10:31:32 +00:00
format_template_resultset = '/some/path/resultset.format', format_template_row = '/some/path/row.format', format_template_rows_between_delimiter = ','
```
`/some/path/resultset.format` :
``` text
{${}"meta"${}:${:JSON},${}"data"${}:${}[${data}]${},${}"totals"${}:${:JSON},${}"extremes"${}:${:JSON},${}"rows"${}:${:JSON},${}"rows_before_limit_at_least"${}:${:JSON}${}}
```
`/some/path/row.format` :
``` text
{${}"SearchPhrase"${}:${}${phrase:JSON}${},${}"c"${}:${}${cnt:JSON}${}}
2019-09-06 09:07:23 +00:00
```
2018-12-21 19:23:55 +00:00
## TSKV {#tskv}
2018-10-16 10:47:17 +00:00
2020-12-21 10:31:32 +00:00
类似于TabSeparated, 但是输出的值是name=value格式。名称的转义方式与TabSeparated格式相同, =符号也是转义的。
2018-10-16 10:47:17 +00:00
2020-12-21 10:31:32 +00:00
``` text
SearchPhrase= count()=8267016
SearchPhrase=bathroom interior design count()=2166
SearchPhrase=yandex count()=1655
SearchPhrase=2014 spring fashion count()=1549
SearchPhrase=freeform photos count()=1480
SearchPhrase=angelina jolie count()=1245
SearchPhrase=omsk count()=1112
SearchPhrase=photos of dog breeds count()=1091
SearchPhrase=curtain designs count()=1064
SearchPhrase=baku count()=1000
```
2018-10-16 10:47:17 +00:00
2020-12-21 10:31:32 +00:00
[NULL ](../sql-reference/syntax.md )格式为`\N`。
2018-10-16 10:47:17 +00:00
``` sql
SELECT * FROM t_null FORMAT TSKV
```
2020-12-21 10:31:32 +00:00
``` text
x=1 y=\N
```
2018-10-16 10:47:17 +00:00
2020-12-21 10:31:32 +00:00
当有大量的小列时, 这种格式是无效的, 并且通常没有理由使用它。不过, 就效率而言, 它并不比JSONEachRow差。
这种格式支持数据输出和解析。对于解析, 不同列的值支持任何顺序。省略某些值是可以接受的——它们被视为与其默认值相等。在这种情况下, 0和空白行被用作默认值。不支持在表中指定的复杂值作为缺省值。
2018-10-16 10:47:17 +00:00
2020-12-21 10:31:32 +00:00
解析允许存在不带等号或值的附加字段`tskv`。此字段被忽略。
2018-10-16 06:58:03 +00:00
2018-12-21 19:23:55 +00:00
## CSV {#csv}
2018-10-16 06:58:03 +00:00
2020-12-21 10:31:32 +00:00
按`,`分隔的数据格式([RFC](https://tools.ietf.org/html/rfc4180))。
格式化时,行是用双引号括起来的。字符串中的双引号会以两个双引号输出,除此之外没有其他规则来做字符转义了。日期和时间也会以双引号包括。数字的输出不带引号。值由一个单独的字符隔开,这个字符默认是`,`。行使用Unix换行符( LF) 分隔。数组序列化成CSV规则如下: 首先将数组序列化为`TabSeparated`格式的字符串,然后将结果字符串用双引号包括输出到`CSV`。`CSV`格式的元组被序列化为单独的列(即它们在元组中的嵌套关系会丢失)。
2018-10-16 06:58:03 +00:00
2020-12-21 10:31:32 +00:00
``` bash
$ clickhouse-client --format_csv_delimiter="|" --query="INSERT INTO test.csv FORMAT CSV" < data.csv
```
2018-10-16 06:58:03 +00:00
2020-12-21 10:31:32 +00:00
\* 默认情况下间隔符是`,` ,在[format_csv_delimiter](../operations/settings/settings.md#settings-format_csv_delimiter)中可以了解更多分隔符配置。
2018-10-16 06:58:03 +00:00
2020-12-21 10:31:32 +00:00
解析的时候,可以使用或不使用引号来解析所有值。支持双引号和单引号。行也可以不用引号排列。在这种情况下,它们被解析为逗号或换行符(`CR或`LF`)。在解析不带引号的行时,若违反`RFC`规则, 会忽略前缀和结尾的空格和制表符。对于换行, 全部支持Unix( LF) , Windows( CR LF) 和Mac OS Classic( CR LF) 。
2018-10-16 06:58:03 +00:00
2020-12-21 10:31:32 +00:00
如果启用[input_format_defaults_for_omitted_fields](../operations/settings/settings.md#session_settings-input_format_defaults_for_omitted_fields),空的末尾加引号的输入值将替换为相应列的默认值。
2018-10-16 06:58:03 +00:00
2020-12-21 10:31:32 +00:00
`NULL` 被格式化为`\N`或` NULL`或一个空的非引号字符串(详见配置[input_format_csv_unquoted_null_literal_as_null](../operations/settings/settings.md#settings-input_format_csv_unquoted_null_literal_as_null)或[input_format_defaults_for_omitted_fields](../operations/settings/settings.md#session_settings-input_format_defaults_for_omitted_fields))。
2018-10-16 06:58:03 +00:00
2020-12-21 10:31:32 +00:00
`CSV` 格式支持输出总数和极值的方式与`TabSeparated`相同。
2018-10-16 06:58:03 +00:00
2020-03-20 18:20:59 +00:00
## CSVWithNames {#csvwithnames}
2018-10-16 06:58:03 +00:00
2020-12-21 10:31:32 +00:00
会输出带头部的信息(字段列表),和`TabSeparatedWithNames`一样。
2018-10-16 06:58:03 +00:00
2020-12-21 10:31:32 +00:00
## CustomSeparated {#format-customseparated}
2020-02-22 17:20:17 +00:00
2020-12-21 10:31:32 +00:00
类似于[Template](#format-template), 但它打印或读取所有列和使用转义规则在设置`format_custom_escaping_rule`和分隔符设置`format_custom_field_delimiter`,`format_custom_row_before_delimiter`,`format_custom_row_after_delimiter`,`format_custom_row_between_delimiter`,`format_custom_result_before_delimiter`,`format_custom_result_after_delimiter`中,而不是从格式字符串。
也有`CustomSeparatedIgnoreSpaces`格式,这是类似于`TemplateIgnoreSpaces`。
2020-02-22 17:20:17 +00:00
2018-12-21 19:23:55 +00:00
## JSON {#json}
2018-10-16 06:58:03 +00:00
2020-12-21 10:31:32 +00:00
以JSON格式输出数据。除了数据表之外, 它还输出列名和类型, 以及一些附加信息: 输出行的总数, 以及如果没有LIMIT的话可输出的行数。示例:
2018-10-16 06:58:03 +00:00
2018-10-16 10:47:17 +00:00
``` sql
2018-10-16 06:58:03 +00:00
SELECT SearchPhrase, count() AS c FROM test.hits GROUP BY SearchPhrase WITH TOTALS ORDER BY c DESC LIMIT 5 FORMAT JSON
```
2020-03-20 18:20:59 +00:00
``` json
2018-10-16 06:58:03 +00:00
{
"meta":
[
{
2020-12-21 10:31:32 +00:00
"name": "'hello'",
2018-10-16 06:58:03 +00:00
"type": "String"
},
{
2020-12-21 10:31:32 +00:00
"name": "multiply(42, number)",
2018-10-16 06:58:03 +00:00
"type": "UInt64"
2020-12-21 10:31:32 +00:00
},
{
"name": "range(5)",
"type": "Array(UInt8)"
2018-10-16 06:58:03 +00:00
}
],
"data":
[
{
2020-12-21 10:31:32 +00:00
"'hello'": "hello",
"multiply(42, number)": "0",
"range(5)": [0,1,2,3,4]
2018-10-16 06:58:03 +00:00
},
{
2020-12-21 10:31:32 +00:00
"'hello'": "hello",
"multiply(42, number)": "42",
"range(5)": [0,1,2,3,4]
2018-10-16 06:58:03 +00:00
},
{
2020-12-21 10:31:32 +00:00
"'hello'": "hello",
"multiply(42, number)": "84",
"range(5)": [0,1,2,3,4]
}
],
"rows": 3,
"rows_before_limit_at_least": 3
}
```
JSON与JavaScript兼容。为了确保这一点, 一些字符被另外转义: 斜线`/`被转义为`\/`; 替代的换行符` U+2028`和`U+2029`会打断一些浏览器解析,它们会被转义为`\uXXXX`。 ASCII控制字符被转义: 退格, 换页, 换行, 回车和水平制表符被替换为`\b`, ` \f`, ` \n`, ` \r`, ` \t` 作为使用` \uXXXX`序列的00-1F范围内的剩余字节。 无效的UTF-8序列更改为替换字符, 因此输出文本将包含有效的UTF-8序列。 为了与JavaScript兼容, 默认情况下, Int64和UInt64整数用双引号引起来。要除去引号, 可以将配置参数`output_format_json_quote_64bit_integers`设置为0。
`rows` – 结果输出的行数。
`rows_before_limit_at_least` 去掉 LIMIT过滤后的最小行总数。 只会在查询包含LIMIT条件时输出。
若查询包含 GROUP BY, `rows_before_limit_at_least`就是去掉LIMIT后过滤后的准确行数。
`totals` – 总值 ( 当使用TOTALS条件时) 。
`extremes` – 极值( 当extremes设置为1时) 。
该格式仅适用于输出查询结果,但不适用于解析输入(将数据插入到表中)。
ClickHouse支持[NULL](../sql-reference/syntax.md), 在JSON输出中显示为`null`。若要在输出中启用`+nan`、`-nan`、`+inf`、`-inf`值,请设置[output_format_json_quote_denormals](../operations/settings/settings.md#settings-output_format_json_quote_denormals)为1。
**参考**
- [JSONEachRow ](#jsoneachrow )格式
- [output_format_json_array_of_rows ](../operations/settings/settings.md#output-format-json-array-of-rows )设置
## JSONString {#jsonstring}
与JSON的不同之处在于数据字段以字符串输出, 而不是以类型化JSON值输出。
示例:
```json
{
"meta":
[
{
"name": "'hello'",
"type": "String"
2018-10-16 06:58:03 +00:00
},
{
2020-12-21 10:31:32 +00:00
"name": "multiply(42, number)",
"type": "UInt64"
2018-10-16 06:58:03 +00:00
},
{
2020-12-21 10:31:32 +00:00
"name": "range(5)",
"type": "Array(UInt8)"
2018-10-16 06:58:03 +00:00
}
],
2020-12-21 10:31:32 +00:00
"data":
[
{
"'hello'": "hello",
"multiply(42, number)": "0",
"range(5)": "[0,1,2,3,4]"
},
2018-10-16 06:58:03 +00:00
{
2020-12-21 10:31:32 +00:00
"'hello'": "hello",
"multiply(42, number)": "42",
"range(5)": "[0,1,2,3,4]"
2018-10-16 06:58:03 +00:00
},
{
2020-12-21 10:31:32 +00:00
"'hello'": "hello",
"multiply(42, number)": "84",
"range(5)": "[0,1,2,3,4]"
2018-10-16 06:58:03 +00:00
}
2020-12-21 10:31:32 +00:00
],
2018-10-16 06:58:03 +00:00
2020-12-21 10:31:32 +00:00
"rows": 3,
2018-10-16 06:58:03 +00:00
2020-12-21 10:31:32 +00:00
"rows_before_limit_at_least": 3
2018-10-16 06:58:03 +00:00
}
```
2020-12-21 10:31:32 +00:00
## JSONAsString {#jsonasstring}
2018-10-16 06:58:03 +00:00
2020-12-21 10:31:32 +00:00
在这种格式中, 一个JSON对象被解释为一个值。如果输入有几个JSON对象(逗号分隔),它们将被解释为独立的行。
2018-10-16 06:58:03 +00:00
2020-12-29 14:56:55 +00:00
这种格式只能对具有单个字段类型的表进行解析[String](../sql-reference/data-types/string.md)。其余的列必须设置为[DEFAULT](../sql-reference/statements/create.md)或[MATERIALIZED](../sql-reference/statements/create.md), 或者忽略。一旦将整个JSON对象收集为字符串, 就可以使用[JSON函数](../sql-reference/functions/json-functions.md)运行它。
2018-10-16 06:58:03 +00:00
2020-12-21 10:31:32 +00:00
**示例**
2018-10-16 06:58:03 +00:00
2020-12-21 10:31:32 +00:00
查询:
2018-10-16 06:58:03 +00:00
2020-12-21 10:31:32 +00:00
``` sql
DROP TABLE IF EXISTS json_as_string;
CREATE TABLE json_as_string (json String) ENGINE = Memory;
INSERT INTO json_as_string FORMAT JSONAsString {"foo":{"bar":{"x":"y"},"baz":1}},{},{"any json stucture":1}
SELECT * FROM json_as_string;
```
2018-10-16 06:58:03 +00:00
2020-12-21 10:31:32 +00:00
结果:
2018-10-16 06:58:03 +00:00
2020-12-21 10:31:32 +00:00
``` text
┌─json──────────────────────────────┐
│ {"foo":{"bar":{"x":"y"},"baz":1}} │
│ {} │
│ {"any json stucture":1} │
└───────────────────────────────────┘
```
2018-10-16 06:58:03 +00:00
2018-12-21 19:23:55 +00:00
## JSONCompact {#jsoncompact}
2020-12-21 10:31:32 +00:00
## JSONCompactString {#jsoncompactstring}
2018-10-16 06:58:03 +00:00
2020-12-21 10:31:32 +00:00
与JSON格式不同的是它以数组的方式输出结果, 而不是以结构体。
2018-10-16 06:58:03 +00:00
示例:
2020-03-20 18:20:59 +00:00
``` json
2020-12-21 10:31:32 +00:00
// JSONCompact
2018-10-16 06:58:03 +00:00
{
"meta":
[
{
2020-12-21 10:31:32 +00:00
"name": "'hello'",
2018-10-16 06:58:03 +00:00
"type": "String"
},
{
2020-12-21 10:31:32 +00:00
"name": "multiply(42, number)",
2018-10-16 06:58:03 +00:00
"type": "UInt64"
2020-12-21 10:31:32 +00:00
},
{
"name": "range(5)",
"type": "Array(UInt8)"
2018-10-16 06:58:03 +00:00
}
],
"data":
[
2020-12-21 10:31:32 +00:00
["hello", "0", [0,1,2,3,4]],
["hello", "42", [0,1,2,3,4]],
["hello", "84", [0,1,2,3,4]]
2018-10-16 06:58:03 +00:00
],
2020-12-21 10:31:32 +00:00
"rows": 3,
2018-10-16 06:58:03 +00:00
2020-12-21 10:31:32 +00:00
"rows_before_limit_at_least": 3
}
```
2018-10-16 06:58:03 +00:00
2020-12-21 10:31:32 +00:00
```json
// JSONCompactString
{
"meta":
[
{
"name": "'hello'",
"type": "String"
},
{
"name": "multiply(42, number)",
"type": "UInt64"
},
{
"name": "range(5)",
"type": "Array(UInt8)"
}
],
2018-10-16 06:58:03 +00:00
2020-12-21 10:31:32 +00:00
"data":
[
["hello", "0", "[0,1,2,3,4]"],
["hello", "42", "[0,1,2,3,4]"],
["hello", "84", "[0,1,2,3,4]"]
],
"rows": 3,
"rows_before_limit_at_least": 3
2018-10-16 06:58:03 +00:00
}
```
2018-12-21 19:23:55 +00:00
## JSONEachRow {#jsoneachrow}
2020-12-21 10:31:32 +00:00
## JSONStringEachRow {#jsonstringeachrow}
## JSONCompactEachRow {#jsoncompacteachrow}
## JSONCompactStringEachRow {#jsoncompactstringeachrow}
2018-10-16 06:58:03 +00:00
2020-12-21 10:31:32 +00:00
使用这些格式时, ClickHouse会将行输出为分隔的、换行分隔的JSON值, 但数据作为一个整体不是有效的JSON。
2018-10-16 06:58:03 +00:00
2020-03-20 18:20:59 +00:00
``` json
2020-12-21 10:31:32 +00:00
{"some_int":42,"some_str":"hello","some_tuple":[1,"a"]} // JSONEachRow
[42,"hello",[1,"a"]] // JSONCompactEachRow
["42","hello","(2,'a')"] // JSONCompactStringsEachRow
```
在插入数据时, 应该为每一行提供一个单独的JSON值。
## JSONEachRowWithProgress {#jsoneachrowwithprogress}
## JSONStringEachRowWithProgress {#jsonstringeachrowwithprogress}
与`JSONEachRow`/`JSONStringEachRow`不同的是, ClickHouse还将生成作为JSON值的进度信息。
```json
{"row":{"'hello'":"hello","multiply(42, number)":"0","range(5)":[0,1,2,3,4]}}
{"row":{"'hello'":"hello","multiply(42, number)":"42","range(5)":[0,1,2,3,4]}}
{"row":{"'hello'":"hello","multiply(42, number)":"84","range(5)":[0,1,2,3,4]}}
{"progress":{"read_rows":"3","read_bytes":"24","written_rows":"0","written_bytes":"0","total_rows_to_read":"3"}}
```
## JSONCompactEachRowWithNamesAndTypes {#jsoncompacteachrowwithnamesandtypes}
## JSONCompactStringEachRowWithNamesAndTypes {#jsoncompactstringeachrowwithnamesandtypes}
与`JSONCompactEachRow`/`JSONCompactStringEachRow`不同的是,其中列名和类型被写入前两行。
```json
["'hello'", "multiply(42, number)", "range(5)"]
["String", "UInt64", "Array(UInt8)"]
["hello", "0", [0,1,2,3,4]]
["hello", "42", [0,1,2,3,4]]
["hello", "84", [0,1,2,3,4]]
```
### Inserting Data {#inserting-data}
``` sql
INSERT INTO UserActivity FORMAT JSONEachRow {"PageViews":5, "UserID":"4324182021466249494", "Duration":146,"Sign":-1} {"UserID":"4324182021466249494","PageViews":6,"Duration":185,"Sign":1}
2018-10-16 06:58:03 +00:00
```
2020-12-21 10:31:32 +00:00
ClickHouse允许:
- 对象中key-value的任何顺序。
- 省略一些值。
2018-10-16 06:58:03 +00:00
2020-12-21 10:31:32 +00:00
ClickHouse忽略元素之间的空格和对象后面的逗号。您可以在一行中传递所有对象。你不需要用换行符把它们分开。
2018-10-16 06:58:03 +00:00
2020-12-21 10:31:32 +00:00
**省略值处理**
2019-07-16 09:21:48 +00:00
2020-12-21 10:31:32 +00:00
ClickHouse将省略的值替换为对应的[data types](../sql-reference/data-types/index.md)默认值。
2019-07-16 09:21:48 +00:00
2020-12-21 10:31:32 +00:00
如果指定了`DEFAULT expr`, 则ClickHouse根据属性使用不同的替换规则, 详看[input_format_defaults_for_omitted_fields](../operations/settings/settings.md#session_settings-input_format_defaults_for_omitted_fields)设置。
参考下表:
``` sql
CREATE TABLE IF NOT EXISTS example_table
(
x UInt32,
a DEFAULT x * 2
) ENGINE = Memory;
```
- 如果`input_format_defaults_for_omitted_fields = 0`, 那么`x`和`a`的默认值等于`0`(作为`UInt32`数据类型的默认值)。
- 如果`input_format_defaults_for_omitted_fields = 1`, 那么`x`的默认值为`0`,但`a`的默认值为`x * 2`。
!!! note "注意"
当使用`insert_sample_with_metadata = 1`插入数据时,与使用`insert_sample_with_metadata = 0`插入数据相比, ClickHouse消耗更多的计算资源。
### Selecting Data {#selecting-data}
以`UserActivity`表为例:
``` text
┌──────────────UserID─┬─PageViews─┬─Duration─┬─Sign─┐
│ 4324182021466249494 │ 5 │ 146 │ -1 │
│ 4324182021466249494 │ 6 │ 185 │ 1 │
└─────────────────────┴───────────┴──────────┴──────┘
```
当查询`SELECT * FROM UserActivity FORMAT JSONEachRow`返回:
``` text
{"UserID":"4324182021466249494","PageViews":5,"Duration":146,"Sign":-1}
{"UserID":"4324182021466249494","PageViews":6,"Duration":185,"Sign":1}
```
与[JSON](#json)格式不同, 没有替换无效的UTF-8序列。值以与`JSON`相同的方式转义。
!!! note "提示"
字符串中可以输出任意一组字节。如果您确信表中的数据可以被格式化为JSON而不会丢失任何信息, 那么就使用`JSONEachRow`格式。
### Nested Structures {#jsoneachrow-nested}
如果您有一个包含[Nested](../sql-reference/data-types/nested-data-structures/nested.md)数据类型列的表, 您可以插入具有相同结构的JSON数据。使用[input_format_import_nested_json](../operations/settings/settings.md#settings-input_format_import_nested_json)设置启用该特性。
例如,请参考下表:
2019-07-16 09:21:48 +00:00
2020-03-20 18:20:59 +00:00
``` sql
2019-07-16 09:21:48 +00:00
CREATE TABLE json_each_row_nested (n Nested (s String, i Int32) ) ENGINE = Memory
```
2020-12-21 10:31:32 +00:00
正如您在`Nested`数据类型描述中看到的, ClickHouse将嵌套结构的每个组件作为一个单独的列(`n.s`和`n.i`是我们的表)。您可以通过以下方式插入数据:
2019-07-16 09:21:48 +00:00
2020-03-20 18:20:59 +00:00
``` sql
2019-07-16 09:21:48 +00:00
INSERT INTO json_each_row_nested FORMAT JSONEachRow {"n.s": ["abc", "def"], "n.i": [1, 23]}
```
2020-12-21 10:31:32 +00:00
将数据作为分层JSON对象集插入[input_format_import_nested_json=1](../operations/settings/settings.md#settings-input_format_import_nested_json)。
2019-07-16 09:21:48 +00:00
2020-03-20 18:20:59 +00:00
``` json
2019-07-16 09:21:48 +00:00
{
"n": {
"s": ["abc", "def"],
"i": [1, 23]
}
}
```
2020-04-08 14:22:25 +00:00
如果没有此设置, ClickHouse将引发异常。
2019-07-16 09:21:48 +00:00
2020-03-20 18:20:59 +00:00
``` sql
2019-07-16 09:21:48 +00:00
SELECT name, value FROM system.settings WHERE name = 'input_format_import_nested_json'
```
2020-03-20 18:20:59 +00:00
``` text
2019-07-16 09:21:48 +00:00
┌─name────────────────────────────┬─value─┐
│ input_format_import_nested_json │ 0 │
└─────────────────────────────────┴───────┘
```
2020-03-20 18:20:59 +00:00
``` sql
2019-07-16 09:21:48 +00:00
INSERT INTO json_each_row_nested FORMAT JSONEachRow {"n": {"s": ["abc", "def"], "i": [1, 23]}}
```
2020-03-20 18:20:59 +00:00
``` text
2019-07-16 09:21:48 +00:00
Code: 117. DB::Exception: Unknown field found while parsing JSONEachRow format: n: (at row 1)
```
2020-03-20 18:20:59 +00:00
``` sql
2019-07-16 09:21:48 +00:00
SET input_format_import_nested_json=1
INSERT INTO json_each_row_nested FORMAT JSONEachRow {"n": {"s": ["abc", "def"], "i": [1, 23]}}
SELECT * FROM json_each_row_nested
```
2020-03-20 18:20:59 +00:00
``` text
2019-07-16 09:21:48 +00:00
┌─n.s───────────┬─n.i────┐
│ ['abc','def'] │ [1,23] │
└───────────────┴────────┘
```
2020-12-21 10:31:32 +00:00
## Native {#native}
2018-10-16 06:58:03 +00:00
2020-12-21 10:31:32 +00:00
最高性能的格式。通过二进制格式的块进行写入和读取。对于每个块,该中的行数,列数,列名称和类型以及列的部分将被相继记录。 换句话说,这种格式是`columnar`的 - 它不会将列转换为行。这是用于在服务器之间进行交互的本地界面中使用的格式, 用于使用命令行客户端和C++客户端。
2018-10-16 06:58:03 +00:00
2020-12-21 10:31:32 +00:00
您可以使用此格式快速生成只能由ClickHouse DBMS读取的格式。但自己处理这种格式是没有意义的。
2018-10-16 06:58:03 +00:00
2018-12-21 19:23:55 +00:00
## Null {#null}
2018-10-16 06:58:03 +00:00
2020-12-21 10:31:32 +00:00
没有输出。但是,查询已处理完毕,并且在使用命令行客户端时,数据将传输到客户端。这仅用于测试,包括性能测试。
2018-10-16 06:58:03 +00:00
显然,这种格式只适用于输出,不适用于解析。
2020-12-21 10:31:32 +00:00
## Pretty {#pretty}
2018-10-16 06:58:03 +00:00
2020-12-21 10:31:32 +00:00
将数据以表格形式输出, 也可以使用ANSI转义字符在终端中设置颜色。
2018-10-16 06:58:03 +00:00
它会绘制一个完整的表格,每行数据在终端中占用两行。
2020-12-21 10:31:32 +00:00
每个结果块作为一个单独的表输出。这是必要的,以便在输出块时不需要缓冲结果(为了预先计算所有值的可见宽度,缓冲是必要的)。
[NULL ](../sql-reference/syntax.md )输出为`ᴺᵁᴸᴸ`。
2018-10-16 06:58:03 +00:00
2020-12-21 10:31:32 +00:00
示例(显示[PrettyCompact](#prettycompact)格式)
2018-10-16 06:58:03 +00:00
2018-10-16 10:47:17 +00:00
``` sql
2018-10-16 06:58:03 +00:00
SELECT * FROM t_null
```
2020-12-21 10:31:32 +00:00
``` text
┌─x─┬────y─┐
│ 1 │ ᴺᵁᴸᴸ │
└───┴──────┘
```
行没有转义为Pretty\* 格式。示例显示了[PrettyCompact](#prettycompact)格式:
``` sql
SELECT 'String with \'quotes\' and \t character' AS Escaping_test
```
``` text
┌─Escaping_test────────────────────────┐
│ String with 'quotes' and character │
└──────────────────────────────────────┘
```
2018-10-16 06:58:03 +00:00
2020-12-21 10:31:32 +00:00
为避免将太多数据传输到终端, 只打印前10,000行。 如果行数大于或等于10,000, 则会显示消息`Showed first 10 000`。
2018-10-16 06:58:03 +00:00
该格式仅适用于输出查询结果,但不适用于解析输入(将数据插入到表中)。
2020-12-21 10:31:32 +00:00
Pretty格式支持输出合计值(当使用WITH TOTALS时)和极值(当`extremes`设置为1时)。在这些情况下,合计值和极值将输出在主要数据之后,在单独的表中。示例(显示为[PrettyCompact](#prettycompact)格式):
2018-10-16 06:58:03 +00:00
2018-10-16 10:47:17 +00:00
``` sql
2018-10-16 06:58:03 +00:00
SELECT EventDate, count() AS c FROM test.hits GROUP BY EventDate WITH TOTALS ORDER BY EventDate FORMAT PrettyCompact
```
2020-12-21 10:31:32 +00:00
``` text
┌──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─┐
│ 1970-01-01 │ 8873898 │
└────────────┴─────────┘
Extremes:
┌──EventDate─┬───────c─┐
│ 2014-03-17 │ 1031592 │
│ 2014-03-23 │ 1406958 │
└────────────┴─────────┘
```
2018-10-16 06:58:03 +00:00
2018-12-21 19:23:55 +00:00
## PrettyCompact {#prettycompact}
2018-10-16 06:58:03 +00:00
2020-12-21 10:31:32 +00:00
与[Pretty](#pretty)格式不一样的是`PrettyCompact`去掉了行之间的表格分割线,这样使得结果更加紧凑。
这种格式会在交互命令行客户端下默认使用。
2018-10-16 06:58:03 +00:00
2018-12-21 19:23:55 +00:00
## PrettyCompactMonoBlock {#prettycompactmonoblock}
2018-10-16 06:58:03 +00:00
2020-12-21 10:31:32 +00:00
与[PrettyCompact](#prettycompact)格式不一样的是, 它支持10,000行数据缓冲, 然后输出在一个表格中, 不会按照块来区分。
2018-10-16 06:58:03 +00:00
2018-12-21 19:23:55 +00:00
## PrettyNoEscapes {#prettynoescapes}
2018-10-16 06:58:03 +00:00
2020-12-21 10:31:32 +00:00
与`Pretty`格式不一样的是, 它不使用ANSI字符转义, 这在浏览器显示数据以及在使用`watch`命令行工具是有必要的。
2018-10-16 06:58:03 +00:00
示例:
2020-03-20 18:20:59 +00:00
``` bash
2018-10-16 06:58:03 +00:00
watch -n1 "clickhouse-client --query='SELECT event, value FROM system.events FORMAT PrettyCompactNoEscapes'"
```
2020-12-21 10:31:32 +00:00
您可以使用HTTP接口来获取数据, 显示在浏览器中。
2018-10-16 06:58:03 +00:00
2020-03-20 18:20:59 +00:00
### PrettyCompactNoEscapes {#prettycompactnoescapes}
2018-10-16 06:58:03 +00:00
用法类似上述。
2020-03-20 18:20:59 +00:00
### PrettySpaceNoEscapes {#prettyspacenoescapes}
2018-10-16 06:58:03 +00:00
用法类似上述。
2020-12-21 10:31:32 +00:00
### PrettyCompactNoEscapes {#prettycompactnoescapes}
与前面的设置相同。
### PrettySpaceNoEscapes {#prettyspacenoescapes}
与前面的设置相同。
2018-12-21 19:23:55 +00:00
## PrettySpace {#prettyspace}
2018-10-16 06:58:03 +00:00
2020-12-21 10:31:32 +00:00
与[PrettyCompact](#prettycompact)格式不一样的是,它使用空格来代替网格来显示数据。
2018-10-16 06:58:03 +00:00
2018-12-21 19:23:55 +00:00
## RowBinary {#rowbinary}
2018-10-16 06:58:03 +00:00
以二进制格式逐行格式化和解析数据。行和值连续列出,没有分隔符。
这种格式比 Native 格式效率低,因为它是基于行的。
整数使用固定长度的小端表示法。 例如, UInt64 使用8个字节。
DateTime 被表示为 UInt32 类型的Unix 时间戳值。
Date 被表示为 UInt16 对象,它的值为 1970-01-01以来的天数。
2018-12-25 15:25:43 +00:00
字符串表示为 varint 长度(无符号 [LEB128 ](https://en.wikipedia.org/wiki/LEB128 )),后跟字符串的字节数。
2018-10-16 06:58:03 +00:00
FixedString 被简单地表示为一个字节序列。
2018-12-25 15:25:43 +00:00
数组表示为 varint 长度(无符号 [LEB128 ](https://en.wikipedia.org/wiki/LEB128 )),后跟有序的数组元素。
2018-10-16 06:58:03 +00:00
2020-04-30 18:19:18 +00:00
对于 [NULL ](../sql-reference/syntax.md#null-literal ) 的支持, 一个为 1 或 0 的字节会加在每个 [可为空 ](../sql-reference/data-types/nullable.md ) 值前面。如果为 1, 那么该值就是 `NULL` 。 如果为 0, 则不为 `NULL` 。
2018-10-16 06:58:03 +00:00
2020-02-22 17:20:17 +00:00
## RowBinaryWithNamesAndTypes {#rowbinarywithnamesandtypes}
2020-04-08 14:22:25 +00:00
类似于 [RowBinary ](#rowbinary ),但添加了标题:
2020-02-22 17:20:17 +00:00
2020-04-08 14:22:25 +00:00
- [LEB128 ](https://en.wikipedia.org/wiki/LEB128 )-编码列数( N)
- N `String` s指定列名
- N `String` s指定列类型
2020-02-22 17:20:17 +00:00
2020-04-08 14:22:25 +00:00
## 值 {#data-format-values}
2018-10-16 06:58:03 +00:00
2020-04-30 18:19:18 +00:00
在括号中打印每一行。行由逗号分隔。最后一行之后没有逗号。括号内的值也用逗号分隔。数字以十进制格式输出,不含引号。 数组以方括号输出。带有时间的字符串,日期和时间用引号包围输出。转义字符的解析规则与 [TabSeparated ](#tabseparated ) 格式类似。 在格式化过程中,不插入额外的空格,但在解析过程中,空格是被允许并跳过的(除了数组值之外的空格,这是不允许的)。[NULL](../sql-reference/syntax.md) 为 `NULL` 。
2018-10-16 06:58:03 +00:00
以 Values 格式传递数据时需要转义的最小字符集是:单引号和反斜线。
这是 `INSERT INTO t VALUES ...` 中可以使用的格式,但您也可以将其用于查询结果。
2020-04-08 14:22:25 +00:00
## 垂直 {#vertical}
2018-10-16 06:58:03 +00:00
使用指定的列名在单独的行上打印每个值。如果每行都包含大量列,则此格式便于打印一行或几行。
2020-04-30 18:19:18 +00:00
[NULL ](../sql-reference/syntax.md ) 输出为 `ᴺᵁᴸᴸ` 。
2018-10-16 06:58:03 +00:00
示例:
2018-10-16 10:47:17 +00:00
``` sql
2018-10-16 06:58:03 +00:00
SELECT * FROM t_null FORMAT Vertical
```
2020-03-21 04:11:51 +00:00
Row 1:
──────
x: 1
y: ᴺᵁᴸᴸ
2018-10-16 06:58:03 +00:00
该格式仅适用于输出查询结果,但不适用于解析输入(将数据插入到表中)。
2020-03-20 18:20:59 +00:00
## VerticalRaw {#verticalraw}
2018-10-16 06:58:03 +00:00
和 `Vertical` 格式不同点在于,行是不会被转义的。
这种格式仅仅适用于输出,但不适用于解析输入(将数据插入到表中)。
示例:
2020-03-21 04:11:51 +00:00
:) SHOW CREATE TABLE geonames FORMAT VerticalRaw;
Row 1:
──────
statement: CREATE TABLE default.geonames ( geonameid UInt32, date Date DEFAULT CAST('2017-12-08' AS Date)) ENGINE = MergeTree(date, geonameid, 8192)
2020-03-20 18:20:59 +00:00
2020-03-21 04:11:51 +00:00
:) SELECT 'string with \'quotes\' and \t with some special \n characters' AS test FORMAT VerticalRaw;
Row 1:
──────
test: string with 'quotes' and with some special
characters
2018-10-16 06:58:03 +00:00
2018-10-17 11:43:36 +00:00
和 Vertical 格式相比:
2018-10-16 06:58:03 +00:00
2020-03-21 04:11:51 +00:00
:) SELECT 'string with \'quotes\' and \t with some special \n characters' AS test FORMAT Vertical;
Row 1:
──────
test: string with \'quotes\' and \t with some special \n characters
2018-10-16 06:58:03 +00:00
2018-12-21 19:23:55 +00:00
## XML {#xml}
2018-10-16 06:58:03 +00:00
该格式仅适用于输出查询结果,但不适用于解析输入,示例:
2020-03-20 18:20:59 +00:00
``` xml
2018-10-16 06:58:03 +00:00
<?xml version='1.0' encoding='UTF-8' ?>
< result >
< meta >
< columns >
< column >
< name > SearchPhrase< / name >
< type > String< / type >
< / column >
< column >
< name > count()< / name >
< type > UInt64< / type >
< / column >
< / columns >
< / meta >
< data >
< row >
< SearchPhrase > < / SearchPhrase >
< field > 8267016< / field >
< / row >
< row >
< SearchPhrase > bathroom interior design< / SearchPhrase >
< field > 2166< / field >
< / row >
< row >
< SearchPhrase > yandex< / SearchPhrase >
< field > 1655< / field >
< / row >
< row >
< SearchPhrase > 2014 spring fashion< / SearchPhrase >
< field > 1549< / field >
< / row >
< row >
< SearchPhrase > freeform photos< / SearchPhrase >
< field > 1480< / field >
< / row >
< row >
< SearchPhrase > angelina jolie< / SearchPhrase >
< field > 1245< / field >
< / row >
< row >
< SearchPhrase > omsk< / SearchPhrase >
< field > 1112< / field >
< / row >
< row >
< SearchPhrase > photos of dog breeds< / SearchPhrase >
< field > 1091< / field >
< / row >
< row >
< SearchPhrase > curtain designs< / SearchPhrase >
< field > 1064< / field >
< / row >
< row >
< SearchPhrase > baku< / SearchPhrase >
< field > 1000< / field >
< / row >
< / data >
< rows > 10< / rows >
< rows_before_limit_at_least > 141137< / rows_before_limit_at_least >
< / result >
```
如果列名称没有可接受的格式,则仅使用 `field` 作为元素名称。 通常, XML 结构遵循 JSON 结构。
就像JSON一样, 将无效的 UTF-8 字符都作替换,以便输出文本将包含有效的 UTF-8 字符序列。
在字符串值中,字符 `<` 和 `& ` 被转义为 `<` 和 `& ` 。
数组输出为 `<array> <elem> Hello </ elem> <elem> World </ elem> ... </ array>` ,元组输出为 `<tuple> <elem> Hello </ elem> <elem> World </ ELEM> ... </tuple>` 。
2018-10-16 10:47:17 +00:00
2018-12-21 19:23:55 +00:00
## CapnProto {#capnproto}
2018-10-16 10:47:17 +00:00
2020-04-30 18:19:18 +00:00
Cap’ n Proto 是一种二进制消息格式,类似 Protocol Buffers 和 Thriftis, 但与 JSON 或 MessagePack 格式不一样。
2018-10-16 10:47:17 +00:00
2020-04-30 18:19:18 +00:00
Cap’ n Proto 消息格式是严格类型的,而不是自我描述,这意味着它们不需要外部的描述。这种格式可以实时地应用,并针对每个查询进行缓存。
2018-10-16 10:47:17 +00:00
``` sql
SELECT SearchPhrase, count() AS c FROM test.hits
GROUP BY SearchPhrase FORMAT CapnProto SETTINGS schema = 'schema:Message'
```
其中 `schema.capnp` 描述如下:
2020-03-21 04:11:51 +00:00
struct Message {
SearchPhrase @0 :Text;
c @1 :Uint64;
}
2018-10-16 10:47:17 +00:00
2020-10-13 17:23:29 +00:00
格式文件存储的目录可以在服务配置中的 [format_schema_path ](../operations/server-configuration-parameters/settings.md ) 指定。
2018-10-16 10:47:17 +00:00
2020-04-30 18:19:18 +00:00
Cap’ n Proto 反序列化是很高效的,通常不会增加系统的负载。
2020-02-22 17:20:17 +00:00
## Protobuf {#protobuf}
2020-04-08 14:22:25 +00:00
Protobuf-是一个 [协议缓冲区 ](https://developers.google.com/protocol-buffers/ ) 格式。
2020-02-22 17:20:17 +00:00
2020-04-08 14:22:25 +00:00
此格式需要外部格式架构。 在查询之间缓存架构。
ClickHouse支持 `proto2` 和 `proto3` 语法 支持重复/可选/必填字段。
2020-02-22 17:20:17 +00:00
2020-04-08 14:22:25 +00:00
使用示例:
2020-02-22 17:20:17 +00:00
2020-03-20 18:20:59 +00:00
``` sql
2020-02-22 17:20:17 +00:00
SELECT * FROM test.table FORMAT Protobuf SETTINGS format_schema = 'schemafile:MessageType'
```
2020-03-20 18:20:59 +00:00
``` bash
2020-02-22 17:20:17 +00:00
cat protobuf_messages.bin | clickhouse-client --query "INSERT INTO test.table FORMAT Protobuf SETTINGS format_schema='schemafile:MessageType'"
```
2020-04-08 14:22:25 +00:00
哪里的文件 `schemafile.proto` 看起来像这样:
2020-02-22 17:20:17 +00:00
2020-03-20 18:20:59 +00:00
``` capnp
2020-02-22 17:20:17 +00:00
syntax = "proto3";
message MessageType {
string name = 1;
string surname = 2;
uint32 birthDate = 3;
repeated string phoneNumbers = 4;
};
```
2020-04-08 14:22:25 +00:00
要查找协议缓冲区的消息类型的表列和字段之间的对应关系, ClickHouse比较它们的名称。
这种比较是不区分大小写和字符 `_` (下划线)和 `.` (点)被认为是相等的。
如果协议缓冲区消息的列和字段的类型不同,则应用必要的转换。
2020-02-22 17:20:17 +00:00
2020-04-08 14:22:25 +00:00
支持嵌套消息。 例如,对于字段 `z` 在下面的消息类型
2020-02-22 17:20:17 +00:00
2020-03-20 18:20:59 +00:00
``` capnp
2020-02-22 17:20:17 +00:00
message MessageType {
message XType {
message YType {
int32 z;
};
repeated YType y;
};
XType x;
};
```
2020-04-08 14:22:25 +00:00
ClickHouse尝试找到一个名为 `x.y.z` (或 `x_y_z` 或 `X.y_Z` 等)。
2020-04-30 18:19:18 +00:00
嵌套消息适用于输入或输出一个 [嵌套数据结构 ](../sql-reference/data-types/nested-data-structures/nested.md ).
2020-02-22 17:20:17 +00:00
2020-04-08 14:22:25 +00:00
在protobuf模式中定义的默认值, 如下所示
2020-02-22 17:20:17 +00:00
2020-03-20 18:20:59 +00:00
``` capnp
2020-02-22 17:20:17 +00:00
syntax = "proto2";
message MessageType {
optional int32 result_per_page = 3 [default = 10];
}
```
2020-04-30 18:19:18 +00:00
不应用;该 [表默认值 ](../sql-reference/statements/create.md#create-default-values ) 用来代替它们。
2020-02-22 17:20:17 +00:00
2020-04-08 14:22:25 +00:00
ClickHouse在输入和输出protobuf消息 `length-delimited` 格式。
这意味着每个消息之前,应该写它的长度作为一个 [varint ](https://developers.google.com/protocol-buffers/docs/encoding#varints ).
另请参阅 [如何在流行语言中读取/写入长度分隔的protobuf消息 ](https://cwiki.apache.org/confluence/display/GEODE/Delimiting+Protobuf+Messages ).
2020-02-22 17:20:17 +00:00
## Avro {#data-format-avro}
2020-04-08 14:22:25 +00:00
[Apache Avro ](http://avro.apache.org/ ) 是在Apache Hadoop项目中开发的面向行的数据序列化框架。
2020-02-22 17:20:17 +00:00
2020-04-08 14:22:25 +00:00
ClickHouse Avro格式支持读取和写入 [Avro数据文件 ](http://avro.apache.org/docs/current/spec.html#Object+Container+Files ).
2020-02-22 17:20:17 +00:00
2020-10-13 17:23:29 +00:00
### 数据类型匹配{#sql_reference/data_types-matching} {#data-types-matching-sql_referencedata_types-matching}
2020-02-22 17:20:17 +00:00
2020-04-30 18:19:18 +00:00
下表显示了支持的数据类型以及它们如何匹配ClickHouse [数据类型 ](../sql-reference/data-types/index.md ) 在 `INSERT` 和 `SELECT` 查询。
2020-02-22 17:20:17 +00:00
2020-04-08 14:22:25 +00:00
| Avro数据类型 `INSERT` | ClickHouse数据类型 | Avro数据类型 `SELECT` |
|---------------------------------------------|-------------------------------------------------------------------------------------------------------------------|------------------------------|
2020-04-30 18:19:18 +00:00
| `boolean` , `int` , `long` , `float` , `double` | [Int(8/16/32) ](../sql-reference/data-types/int-uint.md ), [UInt(8/16/32) ](../sql-reference/data-types/int-uint.md ) | `int` |
| `boolean` , `int` , `long` , `float` , `double` | [Int64 ](../sql-reference/data-types/int-uint.md ), [UInt64 ](../sql-reference/data-types/int-uint.md ) | `long` |
| `boolean` , `int` , `long` , `float` , `double` | [Float32 ](../sql-reference/data-types/float.md ) | `float` |
| `boolean` , `int` , `long` , `float` , `double` | [Float64 ](../sql-reference/data-types/float.md ) | `double` |
| `bytes` , `string` , `fixed` , `enum` | [字符串 ](../sql-reference/data-types/string.md ) | `bytes` |
| `bytes` , `string` , `fixed` | [固定字符串(N) ](../sql-reference/data-types/fixedstring.md ) | `fixed(N)` |
| `enum` | [枚举(8/16) ](../sql-reference/data-types/enum.md ) | `enum` |
| `array(T)` | [阵列(T) ](../sql-reference/data-types/array.md ) | `array(T)` |
| `union(null, T)` , `union(T, null)` | [可为空(T) ](../sql-reference/data-types/date.md ) | `union(null, T)` |
| `null` | [可为空(无) ](../sql-reference/data-types/special-data-types/nothing.md ) | `null` |
| `int (date)` \* | [日期 ](../sql-reference/data-types/date.md ) | `int (date)` \* |
| `long (timestamp-millis)` \* | [DateTime64(3) ](../sql-reference/data-types/datetime.md ) | `long (timestamp-millis)` \* |
| `long (timestamp-micros)` \* | [DateTime64(6) ](../sql-reference/data-types/datetime.md ) | `long (timestamp-micros)` \* |
2020-02-22 17:20:17 +00:00
2020-04-08 14:22:25 +00:00
\* [Avro逻辑类型 ](http://avro.apache.org/docs/current/spec.html#Logical+Types )
2020-02-22 17:20:17 +00:00
2020-04-08 14:22:25 +00:00
不支持的Avro数据类型: `record` (非根), `map`
2020-02-22 17:20:17 +00:00
2020-04-08 14:22:25 +00:00
不支持的Avro逻辑数据类型: `uuid` , `time-millis` , `time-micros` , `duration`
2020-02-22 17:20:17 +00:00
2020-04-08 14:22:25 +00:00
### 插入数据 {#inserting-data}
2020-02-22 17:20:17 +00:00
2020-04-08 14:22:25 +00:00
将Avro文件中的数据插入ClickHouse表:
2020-02-22 17:20:17 +00:00
2020-03-20 18:20:59 +00:00
``` bash
2020-02-22 17:20:17 +00:00
$ cat file.avro | clickhouse-client --query="INSERT INTO {some_table} FORMAT Avro"
```
2020-04-08 14:22:25 +00:00
输入Avro文件的根模式必须是 `record` 类型。
2020-02-22 17:20:17 +00:00
2020-04-08 14:22:25 +00:00
要查找Avro schema的表列和字段之间的对应关系, ClickHouse比较它们的名称。 此比较区分大小写。
跳过未使用的字段。
2020-02-22 17:20:17 +00:00
2020-04-08 14:22:25 +00:00
ClickHouse表列的数据类型可能与插入的Avro数据的相应字段不同。 插入数据时, ClickHouse根据上表解释数据类型, 然后 [投 ](../query_language/functions/type_conversion_functions/#type_conversion_function-cast ) 将数据转换为相应的列类型。
2020-02-22 17:20:17 +00:00
2020-04-08 14:22:25 +00:00
### 选择数据 {#selecting-data}
2020-02-22 17:20:17 +00:00
2020-04-08 14:22:25 +00:00
从ClickHouse表中选择数据到Avro文件:
2020-02-22 17:20:17 +00:00
2020-03-20 18:20:59 +00:00
``` bash
2020-02-22 17:20:17 +00:00
$ clickhouse-client --query="SELECT * FROM {some_table} FORMAT Avro" > file.avro
```
2020-04-08 14:22:25 +00:00
列名必须:
2020-02-22 17:20:17 +00:00
2020-04-08 14:22:25 +00:00
- 名,名,名,名 `[A-Za-z_]`
- 随后只包含 `[A-Za-z0-9_]`
2020-02-22 17:20:17 +00:00
2020-10-13 17:23:29 +00:00
输出Avro文件压缩和同步间隔可以配置 [output_format_avro_codec ](../operations/settings/settings.md#settings-output_format_avro_codec ) 和 [output_format_avro_sync_interval ](../operations/settings/settings.md#settings-output_format_avro_sync_interval ) 分别。
2020-02-22 17:20:17 +00:00
2020-02-26 07:59:07 +00:00
## AvroConfluent {#data-format-avro-confluent}
2020-02-22 17:20:17 +00:00
2020-04-08 14:22:25 +00:00
AvroConfluent支持解码单对象Avro消息常用于 [卡夫卡 ](https://kafka.apache.org/ ) 和 [汇合的模式注册表 ](https://docs.confluent.io/current/schema-registry/index.html ).
2020-02-22 17:20:17 +00:00
2020-04-08 14:22:25 +00:00
每个Avro消息都嵌入了一个架构id, 该架构id可以在架构注册表的帮助下解析为实际架构。
2020-02-22 17:20:17 +00:00
2020-04-08 14:22:25 +00:00
模式解析后会进行缓存。
2020-02-22 17:20:17 +00:00
2020-10-13 17:23:29 +00:00
架构注册表URL配置为 [format_avro_schema_registry_url ](../operations/settings/settings.md#settings-format_avro_schema_registry_url )
2020-02-22 17:20:17 +00:00
2020-10-13 17:23:29 +00:00
### 数据类型匹配{#sql_reference/data_types-matching-1} {#data-types-matching-sql_referencedata_types-matching-1}
2020-02-22 17:20:17 +00:00
2020-04-08 14:22:25 +00:00
和 [Avro ](#data-format-avro )
2020-02-22 17:20:17 +00:00
2020-04-08 14:22:25 +00:00
### 用途 {#usage}
2020-02-22 17:20:17 +00:00
2020-04-08 14:22:25 +00:00
要快速验证架构解析,您可以使用 [kafkacat ](https://github.com/edenhill/kafkacat ) 与 [ツ环板-ョツ嘉ッツ偲 ](../operations/utilities/clickhouse-local.md ):
2020-02-22 17:20:17 +00:00
2020-03-20 18:20:59 +00:00
``` bash
2020-02-22 17:20:17 +00:00
$ kafkacat -b kafka-broker -C -t topic1 -o beginning -f '%s' -c 3 | clickhouse-local --input-format AvroConfluent --format_avro_schema_registry_url 'http://schema-registry' -S "field1 Int64, field2 String" -q 'select * from table'
1 a
2 b
3 c
```
2020-04-30 18:19:18 +00:00
使用 `AvroConfluent` 与 [卡夫卡 ](../engines/table-engines/integrations/kafka.md ):
2020-03-20 18:20:59 +00:00
``` sql
2020-02-22 17:20:17 +00:00
CREATE TABLE topic1_stream
(
field1 String,
field2 String
)
ENGINE = Kafka()
SETTINGS
kafka_broker_list = 'kafka-broker',
kafka_topic_list = 'topic1',
kafka_group_name = 'group1',
kafka_format = 'AvroConfluent';
SET format_avro_schema_registry_url = 'http://schema-registry';
SELECT * FROM topic1_stream;
```
2020-04-08 14:22:25 +00:00
!!! note "警告"
设置 `format_avro_schema_registry_url` 需要在配置 `users.xml` restart动后保持它的价值。
2020-02-22 17:20:17 +00:00
2021-01-23 14:31:57 +00:00
## Parquet {#data-format-parquet}
2020-02-22 17:20:17 +00:00
2021-01-23 14:31:57 +00:00
[Apache Parquet ](http://parquet.apache.org/ ) 是Hadoop生态系统中普遍存在的列式存储格式。 ClickHouse支持此格式的读写操作。
2020-02-22 17:20:17 +00:00
2020-10-13 17:23:29 +00:00
### 数据类型匹配{#sql_reference/data_types-matching-2} {#data-types-matching-sql_referencedata_types-matching-2}
2020-02-22 17:20:17 +00:00
2020-04-30 18:19:18 +00:00
下表显示了支持的数据类型以及它们如何匹配ClickHouse [数据类型 ](../sql-reference/data-types/index.md ) 在 `INSERT` 和 `SELECT` 查询。
2020-02-22 17:20:17 +00:00
2020-04-08 14:22:25 +00:00
| Parquet数据类型 (`INSERT`) | ClickHouse数据类型 | Parquet数据类型 (`SELECT`) |
|----------------------------|----------------------------------------------------------|----------------------------|
2020-04-30 18:19:18 +00:00
| `UINT8` , `BOOL` | [UInt8 ](../sql-reference/data-types/int-uint.md ) | `UINT8` |
| `INT8` | [Int8 ](../sql-reference/data-types/int-uint.md ) | `INT8` |
| `UINT16` | [UInt16 ](../sql-reference/data-types/int-uint.md ) | `UINT16` |
| `INT16` | [Int16 ](../sql-reference/data-types/int-uint.md ) | `INT16` |
| `UINT32` | [UInt32 ](../sql-reference/data-types/int-uint.md ) | `UINT32` |
| `INT32` | [Int32 ](../sql-reference/data-types/int-uint.md ) | `INT32` |
| `UINT64` | [UInt64 ](../sql-reference/data-types/int-uint.md ) | `UINT64` |
| `INT64` | [Int64 ](../sql-reference/data-types/int-uint.md ) | `INT64` |
| `FLOAT` , `HALF_FLOAT` | [Float32 ](../sql-reference/data-types/float.md ) | `FLOAT` |
| `DOUBLE` | [Float64 ](../sql-reference/data-types/float.md ) | `DOUBLE` |
| `DATE32` | [日期 ](../sql-reference/data-types/date.md ) | `UINT16` |
| `DATE64` , `TIMESTAMP` | [日期时间 ](../sql-reference/data-types/datetime.md ) | `UINT32` |
| `STRING` , `BINARY` | [字符串 ](../sql-reference/data-types/string.md ) | `STRING` |
| — | [固定字符串 ](../sql-reference/data-types/fixedstring.md ) | `STRING` |
| `DECIMAL` | [十进制 ](../sql-reference/data-types/decimal.md ) | `DECIMAL` |
2020-02-22 17:20:17 +00:00
2021-01-23 14:31:57 +00:00
ClickHouse支持可配置的精度 `Decimal` 类型。 该 `INSERT` 查询对待 Parquet `DECIMAL` 键入为ClickHouse `Decimal128` 类型。
2020-02-22 17:20:17 +00:00
2020-04-08 14:22:25 +00:00
不支持的Parquet数据类型: `DATE32` , `TIME32` , `FIXED_SIZE_BINARY` , `JSON` , `UUID` , `ENUM` .
2020-02-22 17:20:17 +00:00
2020-04-08 14:22:25 +00:00
ClickHouse表列的数据类型可能与插入的Parquet数据的相应字段不同。 插入数据时, ClickHouse根据上表解释数据类型, 然后 [投 ](../query_language/functions/type_conversion_functions/#type_conversion_function-cast ) 为ClickHouse表列设置的数据类型的数据。
2020-02-22 17:20:17 +00:00
2020-04-08 14:22:25 +00:00
### 插入和选择数据 {#inserting-and-selecting-data}
2020-02-22 17:20:17 +00:00
2020-04-08 14:22:25 +00:00
您可以通过以下命令将Parquet数据从文件插入到ClickHouse表中:
2020-02-22 17:20:17 +00:00
2020-03-20 18:20:59 +00:00
``` bash
2020-02-22 17:20:17 +00:00
$ cat {filename} | clickhouse-client --query="INSERT INTO {some_table} FORMAT Parquet"
```
2020-04-08 14:22:25 +00:00
您可以从ClickHouse表中选择数据, 并通过以下命令将它们保存到Parquet格式的某个文件中:
2020-02-22 17:20:17 +00:00
2020-03-20 18:20:59 +00:00
``` bash
2020-02-22 17:20:17 +00:00
$ clickhouse-client --query="SELECT * FROM {some_table} FORMAT Parquet" > {some_file.pq}
```
2020-04-30 18:19:18 +00:00
要与Hadoop交换数据, 您可以使用 [HDFS表引擎 ](../engines/table-engines/integrations/hdfs.md ).
2020-02-22 17:20:17 +00:00
## ORC {#data-format-orc}
2020-04-08 14:22:25 +00:00
[阿帕奇兽人 ](https://orc.apache.org/ ) 是Hadoop生态系统中普遍存在的列式存储格式。 您只能将此格式的数据插入ClickHouse。
2020-02-22 17:20:17 +00:00
2020-10-13 17:23:29 +00:00
### 数据类型匹配{#sql_reference/data_types-matching-3} {#data-types-matching-sql_referencedata_types-matching-3}
2020-02-22 17:20:17 +00:00
2020-04-30 18:19:18 +00:00
下表显示了支持的数据类型以及它们如何匹配ClickHouse [数据类型 ](../sql-reference/data-types/index.md ) 在 `INSERT` 查询。
2020-02-22 17:20:17 +00:00
2020-04-08 14:22:25 +00:00
| ORC数据类型 (`INSERT`) | ClickHouse数据类型 |
|------------------------|-----------------------------------------------------|
2020-04-30 18:19:18 +00:00
| `UINT8` , `BOOL` | [UInt8 ](../sql-reference/data-types/int-uint.md ) |
| `INT8` | [Int8 ](../sql-reference/data-types/int-uint.md ) |
| `UINT16` | [UInt16 ](../sql-reference/data-types/int-uint.md ) |
| `INT16` | [Int16 ](../sql-reference/data-types/int-uint.md ) |
| `UINT32` | [UInt32 ](../sql-reference/data-types/int-uint.md ) |
| `INT32` | [Int32 ](../sql-reference/data-types/int-uint.md ) |
| `UINT64` | [UInt64 ](../sql-reference/data-types/int-uint.md ) |
| `INT64` | [Int64 ](../sql-reference/data-types/int-uint.md ) |
| `FLOAT` , `HALF_FLOAT` | [Float32 ](../sql-reference/data-types/float.md ) |
| `DOUBLE` | [Float64 ](../sql-reference/data-types/float.md ) |
| `DATE32` | [日期 ](../sql-reference/data-types/date.md ) |
| `DATE64` , `TIMESTAMP` | [日期时间 ](../sql-reference/data-types/datetime.md ) |
| `STRING` , `BINARY` | [字符串 ](../sql-reference/data-types/string.md ) |
| `DECIMAL` | [十进制 ](../sql-reference/data-types/decimal.md ) |
2020-02-22 17:20:17 +00:00
2020-04-08 14:22:25 +00:00
ClickHouse支持的可配置精度 `Decimal` 类型。 该 `INSERT` 查询对待兽人 `DECIMAL` 键入为ClickHouse `Decimal128` 类型。
2020-02-22 17:20:17 +00:00
2020-04-08 14:22:25 +00:00
不支持的ORC数据类型: `DATE32` , `TIME32` , `FIXED_SIZE_BINARY` , `JSON` , `UUID` , `ENUM` .
2020-02-22 17:20:17 +00:00
2020-04-08 14:22:25 +00:00
ClickHouse表列的数据类型不必匹配相应的ORC数据字段。 插入数据时, ClickHouse根据上表解释数据类型, 然后 [投 ](../query_language/functions/type_conversion_functions/#type_conversion_function-cast ) 将数据转换为ClickHouse表列的数据类型集。
2020-02-22 17:20:17 +00:00
2020-04-08 14:22:25 +00:00
### 插入数据 {#inserting-data-1}
2020-02-22 17:20:17 +00:00
2020-04-08 14:22:25 +00:00
您可以通过以下命令将文件中的ORC数据插入到ClickHouse表中:
2020-02-22 17:20:17 +00:00
2020-03-20 18:20:59 +00:00
``` bash
2020-02-22 17:20:17 +00:00
$ cat filename.orc | clickhouse-client --query="INSERT INTO some_table FORMAT ORC"
```
2020-04-30 18:19:18 +00:00
要与Hadoop交换数据, 您可以使用 [HDFS表引擎 ](../engines/table-engines/integrations/hdfs.md ).
2020-02-22 17:20:17 +00:00
2020-04-08 14:22:25 +00:00
## 格式架构 {#formatschema}
2020-02-22 17:20:17 +00:00
2020-04-08 14:22:25 +00:00
包含格式架构的文件名由该设置设置 `format_schema` .
当使用其中一种格式时,需要设置此设置 `Cap'n Proto` 和 `Protobuf` .
格式架构是文件名和此文件中消息类型的名称的组合,用冒号分隔,
2020-03-20 18:20:59 +00:00
e.g. `schemafile.proto:MessageType` .
2020-04-08 14:22:25 +00:00
如果文件具有格式的标准扩展名(例如, `.proto` 为 `Protobuf` ),
它可以被省略,在这种情况下,格式模式如下所示 `schemafile:MessageType` .
2020-02-22 17:20:17 +00:00
2020-04-08 14:22:25 +00:00
如果您通过输入或输出数据 [客户 ](../interfaces/cli.md ) 在交互模式下,格式架构中指定的文件名
可以包含绝对路径或相对于客户端上当前目录的路径。
如果在批处理模式下使用客户端,则由于安全原因,架构的路径必须是相对的。
2020-02-22 17:20:17 +00:00
2020-04-08 14:22:25 +00:00
如果您通过输入或输出数据 [HTTP接口 ](../interfaces/http.md ) 格式架构中指定的文件名
2020-10-13 17:23:29 +00:00
应该位于指定的目录中 [format_schema_path ](../operations/server-configuration-parameters/settings.md#server_configuration_parameters-format_schema_path )
2020-04-08 14:22:25 +00:00
在服务器配置中。
2020-02-22 17:20:17 +00:00
2020-04-08 14:22:25 +00:00
[原始文章 ](https://clickhouse.tech/docs/en/interfaces/formats/ ) <!--hide-->
2020-02-22 17:20:17 +00:00
2020-04-08 14:22:25 +00:00
## 跳过错误 {#skippingerrors}
2020-02-22 17:20:17 +00:00
2020-10-13 17:23:29 +00:00
一些格式,如 `CSV` , `TabSeparated` , `TSKV` , `JSONEachRow` , `Template` , `CustomSeparated` 和 `Protobuf` 如果发生解析错误,可以跳过断开的行,并从下一行开始继续解析。 看 [input_format_allow_errors_num ](../operations/settings/settings.md#settings-input_format_allow_errors_num ) 和
[input_format_allow_errors_ratio ](../operations/settings/settings.md#settings-input_format_allow_errors_ratio ) 设置。
2020-04-08 14:22:25 +00:00
限制:
-在解析错误的情况下 `JSONEachRow` 跳过所有数据, 直到新行( 或EOF) , 所以行必须由 `\n` 正确计算错误。
- `Template` 和 `CustomSeparated` 在最后一列之后使用分隔符,并在行之间使用分隔符来查找下一行的开头,所以跳过错误只有在其中至少有一个不为空时才有效。
2020-02-22 17:20:17 +00:00
2020-01-30 10:34:55 +00:00
[来源文章 ](https://clickhouse.tech/docs/zh/interfaces/formats/ ) <!--hide-->