一、简介
clickhouse有多种数据的导入导出方式,可以灵活使用,下面对这些方式分别做些介绍,导入导出的写法与格式和格式设置有关。
二、导入
1.从s3导入
sql
-- 建库建表
CREATE DATABASE git;
CREATE TABLE git.commits
(
hash String,
author LowCardinality(String),
time DateTime,
message String,
files_added UInt32,
files_deleted UInt32,
files_renamed UInt32,
files_modified UInt32,
lines_added UInt32,
lines_deleted UInt32,
hunks_added UInt32,
hunks_removed UInt32,
hunks_changed UInt32
) ENGINE = MergeTree ORDER BY time;
-- 导入数据
INSERT INTO git.commits SELECT *
FROM s3('https://datasets-documentation.s3.amazonaws.com/github/commits/clickhouse/commits.tsv.xz', 'TSV', 'hash String,author LowCardinality(String), time DateTime, message String, files_added UInt32, files_deleted UInt32, files_renamed UInt32, files_modified UInt32, lines_added UInt32, lines_deleted UInt32, hunks_added UInt32, hunks_removed UInt32, hunks_changed UInt32')
0 rows in set. Elapsed: 1.826 sec. Processed 62.78 thousand rows, 8.50 MB (34.39 thousand rows/s., 4.66 MB/s.)
s3的表达式如下
powershell
s3(path, [aws_access_key_id, aws_secret_access_key,] [format, [structure, [compression]]])
- path --- 包含文件路径的存储桶 URL。 这在只读模式下支持以下通配符:*、?、{abc,def} 和 {N...M},其中 N、M 是数字,'abc'、'def' 是字符串。 有关更多信息,请参阅有关在路径中使用通配符的文档。
- format --- 文件的格式。
- structure --- 表的结构。 格式为"column1_name、column1_type、column2_name、column2_type,..."。
- compression --- 参数是可选的。 支持的值:none、gzip/gz、brotli/br、xz/LZMA、zstd/zst。 默认情况下,它将按文件扩展名自动检测压缩。
所以我们可以看出来上面的insert语句中,第一个参数是s3的url,第二个参数是说明文件为TSV文件,第三个参数把表的结构写下来了,这里没有给第四个参数,因为默认检测了扩展名为xz,所以不需要提供
2.从本地导入
这里可以通过官网获取更详细的内容
2.1 从本地其他文件导入
sql
# 写法一:
clickhouse-client -q "INSERT INTO git.com FORMAT CSV" < out.csv
# 写法二:
INSERT INTO com
FROM INFILE '/data/tools/out.csv'
FORMAT CSV
# 写法三:
cat out.csv|clickhouse-client -q "INSERT INTO git.com FORMAT CSV"
2.2 从本地sql文件导入
ddl语句将被跳过
sql
INSERT INTO com
FROM INFILE '/data/tools/dump.sql' FORMAT MySQLDump
ps: 也可以直接通过文件读取数据,但是要注意读取文件的位置要在这个配置里面:user_files_path,不然会没有权限
sql
SELECT *
FROM file('dump.sql', MySQLDump)
LIMIT 5
2.3 二进制文件
详细内容可以在官网中查看
sql
INSERT INTO com
FROM INFILE '/data/tools/data.clickhouse' FORMAT Native
INSERT INTO com
FROM INFILE '/data/tools/data.clickhouse' COMPRESSION 'lz4' FORMAT Native
INSERT INTO com
FROM INFILE '/data/tools/data.binary' FORMAT RowBinary
INSERT INTO com
FROM INFILE '/data/tools/data.msgpk' FORMAT MsgPack
ps: 导入之前可以用以下语句查看下文件内容,不过也有同样的限制,文件的位置要在user_files_path配置里
sql
DESCRIBE file('data.clickhouse', Native);
三、导出
1.导出数据到s3
1.1 从s3中查询数据
sql
SELECT *
FROM s3('https://datasets-documentation.s3.eu-west-3.amazonaws.com/nyc-taxi/trips_*.gz', 'TabSeparatedWithNames')
LIMIT 10;
SELECT _path, _file, trip_id
FROM s3('https://datasets-documentation.s3.eu-west-3.amazonaws.com/nyc-taxi/trips_0.gz', 'TabSeparatedWithNames')
LIMIT 5;
注意: 我们不需要列出列,因为 TabSeparatedWithNames 格式对第一行中的列名称进行编码。 其他格式(例如 CSV 或 TSV)将为此查询返回自动生成的列,例如 c1、c2、c3 等。
查询还支持虚拟列 _path 和 _file,它们分别提供有关存储桶路径和文件名的信息。
1.2 导出数据到s3
sql
# 导出数据到s3的单个文件中
INSERT INTO FUNCTION
s3(
'https://datasets-documentation.s3.eu-west-3.amazonaws.com/csv/trips.csv.lz4',
's3_key',
's3_secret',
'CSV'
)
SELECT *
FROM trips
LIMIT 10000;
# 导出数据到s3的多个文件中
INSERT INTO FUNCTION
s3(
'https://datasets-documentation.s3.eu-west-3.amazonaws.com/csv/trips_{_partition_id}.csv.lz4',
's3_key',
's3_secret',
'CSV'
)
PARTITION BY rand() % 10
SELECT *
FROM trips
LIMIT 100000;
ps: clickhouse还有更多和s3联动的高级方式,这里先不做说明,后续讲解
2.导出到本地
2.1其他文件
sql
SELECT *
FROM com
INTO OUTFILE '/data/tools/out.csv'
FORMAT CSVWithNames
2.2 sql文件
涉及到的相关参数:
- output_format_sql_insert_table_name: 指定导出表的名称,默认值为table
- output_format_sql_insert_include_column_names:指定在插入查询中是否包含列,默认包含,设置为0则不包含
- output_format_sql_insert_max_batch_size:一个insert语句中的最大行数,默认为65505
- output_format_sql_insert_quote_names :是否用反引号包含字段
- output_format_sql_insert_use_replace:使用replace语句而不是用insert语句,默认值为false
sql
select * from commits limit 100 into outfile '/data/tools/dump.sql' truncate format SQLInsert;
SET output_format_sql_insert_table_name = 'out_table';
select * from table1 into outfile '/data/tools/dump.sql' [append|truncate] format SQLInsert;
# 可以看到/data/tools/dump.sql的文件内容如下,sql的名字变成了out_table
INSERT INTO out_table (`id`, `column1`) VALUES (1, 'abc');
2.3 二进制文件
sql
SELECT * FROM com
INTO OUTFILE '/data/tools/data.clickhouse' FORMAT Native
SELECT * FROM com
INTO OUTFILE '/data/tools/data.clickhouse' COMPRESSION 'lz4' FORMAT Native
SELECT * FROM com
INTO OUTFILE '/data/tools/data.binary' FORMAT RowBinary
# 这里必须要用limit1,多导出的话文件格式就不对了,jpg图片无法正常打开
SELECT * FROM com limit 1
INTO OUTFILE '/data/tools/data.jpg'FORMAT RawBLOB
SELECT * FROM com
INTO OUTFILE '/data/tools/data.msgpk'FORMAT MsgPack