导出 JSON
几乎所有用于导入的 JSON 格式也都可以用于导出。最常用的是 JSONEachRow
SELECT * FROM sometable FORMAT JSONEachRow
{"path":"Bob_Dolman","month":"2016-11-01","hits":245}
{"path":"1-krona","month":"2017-01-01","hits":4}
{"path":"Ahmadabad-e_Kalij-e_Sofla","month":"2017-01-01","hits":3}
或者我们可以使用 JSONCompactEachRow
通过跳过列名来节省磁盘空间。
SELECT * FROM sometable FORMAT JSONCompactEachRow
["Bob_Dolman", "2016-11-01", 245]
["1-krona", "2017-01-01", 4]
["Ahmadabad-e_Kalij-e_Sofla", "2017-01-01", 3]
覆盖数据类型为字符串
ClickHouse 遵循数据类型并会相应地根据标准导出 JSON。但在我们需要将所有值编码为字符串的情况下,我们可以使用 JSONStringsEachRow 格式。
SELECT * FROM sometable FORMAT JSONStringsEachRow
{"path":"Bob_Dolman","month":"2016-11-01","hits":"245"}
{"path":"1-krona","month":"2017-01-01","hits":"4"}
{"path":"Ahmadabad-e_Kalij-e_Sofla","month":"2017-01-01","hits":"3"}
现在,hits
数值列被编码为字符串。对于所有 JSON* 格式都支持导出为字符串,只需浏览 JSONStrings\*
和 JSONCompactStrings\*
格式即可。
SELECT * FROM sometable FORMAT JSONCompactStringsEachRow
["Bob_Dolman", "2016-11-01", "245"]
["1-krona", "2017-01-01", "4"]
["Ahmadabad-e_Kalij-e_Sofla", "2017-01-01", "3"]
将元数据与数据一起导出
应用中常用的通用 JSON 格式,不仅会导出结果数据,还会导出列类型和查询统计信息。
SELECT * FROM sometable FORMAT JSON
{
"meta":
[
{
"name": "path",
"type": "String"
},
…
],
"data":
[
{
"path": "Bob_Dolman",
"month": "2016-11-01",
"hits": 245
},
…
],
"rows": 3,
"statistics":
{
"elapsed": 0.000497457,
"rows_read": 3,
"bytes_read": 87
}
}
JSONCompact 格式将打印相同的元数据,但对数据本身使用紧凑形式。
SELECT * FROM sometable FORMAT JSONCompact
{
"meta":
[
{
"name": "path",
"type": "String"
},
…
],
"data":
[
["Bob_Dolman", "2016-11-01", 245],
["1-krona", "2017-01-01", 4],
["Ahmadabad-e_Kalij-e_Sofla", "2017-01-01", 3]
],
"rows": 3,
"statistics":
{
"elapsed": 0.00074981,
"rows_read": 3,
"bytes_read": 87
}
}
考虑使用 JSONStrings
或 JSONCompactStrings
变体将所有值编码为字符串。
以紧凑的方式导出 JSON 数据和结构
一种更有效的方法来获取数据及其结构,是使用 JSONCompactEachRowWithNamesAndTypes
格式。
SELECT * FROM sometable FORMAT JSONCompactEachRowWithNamesAndTypes
["path", "month", "hits"]
["String", "Date", "UInt32"]
["Bob_Dolman", "2016-11-01", 245]
["1-krona", "2017-01-01", 4]
["Ahmadabad-e_Kalij-e_Sofla", "2017-01-01", 3]
这将使用紧凑的 JSON 格式,并在前面加上两行标题,分别包含列名和类型。然后,此格式可用于将数据导入另一个 ClickHouse 实例(或其他应用程序)。
将 JSON 导出到文件
要将导出的 JSON 数据保存到文件,我们可以使用 INTO OUTFILE 子句。
SELECT * FROM sometable INTO OUTFILE 'out.json' FORMAT JSONEachRow
36838935 rows in set. Elapsed: 2.220 sec. Processed 36.84 million rows, 1.27 GB (16.60 million rows/s., 572.47 MB/s.)
ClickHouse 只用了 2 秒就将近 3700 万条记录导出到一个 JSON 文件中。我们还可以使用 COMPRESSION
子句导出以启用实时压缩。
SELECT * FROM sometable INTO OUTFILE 'out.json.gz' FORMAT JSONEachRow
36838935 rows in set. Elapsed: 22.680 sec. Processed 36.84 million rows, 1.27 GB (1.62 million rows/s., 56.02 MB/s.)
虽然完成此操作需要更多时间,但它会生成一个更小的压缩文件。
2.2G out.json
576M out.json.gz