跳到主要内容
版本:0.3.x

导入数据

流式导入数据(本地文件及内存数据)

ByConity提供了三种方法,从本地文件及内存数据以流式方式导入数据。涵盖了从简单的测试数据插入到从多种格式的文件中导入数据,以及基于查询结果的数据保存。不同的方法适用于不同的使用场景,但请注意,某些高级功能可能会导致性能下降。

方式一:使用 VALUES 格式的常规语法

这种方式适合临时插入少量的数据用于测试。语法如下:

INSERT INTO [db.]table [(c1, c2, c3...)] VALUES (v11, v12, v13), (v21, v22, v23), ...

其中,c1c2c3 是列字段声明,可省略。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_nametype 都是 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();

虽然 VALUESSELECT 子句的形式都支持声明表达式或函数,但是表达式和函数会带来额外的性能开销,从而导致写入性能下降。所以如果追求极致的写入性能。所以如果追求极致的写入性能,就应该避免使用它们。