导入数据
流式导入数据(本地文件及内存数据)
ByConity提供了三种方法,从本地文件及内存数据以流式方式导入数据。涵盖了从简单的测试数据插入到从多种格式的文件中导入数据,以及基于查询结果的数据保存。不同的方法适用于不同的使用场景,但请注意,某些高级功能可能会导致性能下降。
方式一:使用 VALUES 格式的常规语法
这种方式适合临时插入少量的数据用于测试。语法如下:
INSERT INTO [db.]table [(c1, c2, c3...)] VALUES (v11, v12, v13), (v21, v22, v23), ...
其中,c1
、c2
、c3
是列字段声明,可省略。VALUES
后面是要写入的数据,以元组的形式给出,与列字段声明通过下标对应。数据可以批量声明写入,多行数据之间用逗号分隔。
例如对于以下表:
CREATE TABLE test.insert_select_testtable
(
`a` Int8,
`b` String,
`c` Int8,
`date` Date
)
ENGINE = CnchMergeTree()
PARTITION by toYYYYMM(date)
ORDER BY tuple()
可以使用以下语句插入数据:
INSERT INTO insert_select_testtable VALUES (1, 'a', 1,'2022-11-10');
还支持在写入数据时加入表达式或函数,例如:
INSERT INTO insert_select_testtable VALUES (1, 'a', 1, now());
方式二:使用指定格式的语法
这种方式使用指定格式的语法来插入数据:
INSERT INTO [db.]table [(c1, c2, c3...)] FORMAT format_name data_set
ByConity 支持多种数据格式,以常用的 CSV 格式写入为例:
INSERT INTO insert_select_testtable FORMAT CSV \
1, 'a', 1, '2022-11-10'\
2, 'b', 2, '2022-11-11'
同时还支持从文件向表中插入数据。例如:
INSERT INTO [db.]table [(c1, c2, c3)] FORMAT format_name INFILE file_name
使用上面的语句可以从客户端的文件上读取数据并插入表中,file_name
和 type
都是 String
类型,输入文件的格式一定要在 FORMAT
语句中设置。
方式三:使用 SELECT 子句的形式
这种方式适合需要保存某张表结果并供后续查询的情况:
INSERT INTO [db.]table [(c1, c2, c3...)] SELECT ...
写入时与 SELECT
的列的对应关系是使用位置来进行对应的,尽管在 SELECT
表达式与 INSERT
中的名称是不同的。如果需要,会进行对应的类型转换。
例如,假设需要将 insert_select_testtable_1
的数据写入 insert_select_testtable
,则可以使用以下语句:
INSERT INTO insert_select_testtable SELECT * from insert_select_testtable_1
在通过 SELECT
子句写入数据的时候,同样也支持加入表达式或者函数,例如:
INSERT INTO insert_select_testtable SELECT 1, 'a', 1, now();
虽然 VALUES
和 SELECT
子句的形式都支持声明表达式或函数,但是表达式和函数会带来额外的性能开销,从而导致写入性能下降。所以如果追求极致的写入性能。所以如果追求极致的写入性能,就应该避免使用它们。