StarRocks 数据导入指南:INSERT 语句详解
引言
在数据库管理系统中,数据导入是日常操作的重要组成部分。StarRocks 作为一款高性能的分析型数据库,提供了多种数据导入方式。本文将重点介绍如何使用 INSERT 语句向 StarRocks 导入数据,包括基础语法、高级用法以及注意事项。
一、INSERT 语句概述
INSERT 语句是 SQL 标准中的基础操作,StarRocks 对其进行了扩展和增强,支持多种导入场景:
- 直接插入值:通过 VALUES 子句直接插入数据
- 查询结果插入:通过 SELECT 子句将查询结果插入目标表
- 覆盖写入:通过 OVERWRITE 关键字实现数据覆盖
- 外部数据导入:结合 FILES() 函数直接导入云存储或 HDFS 文件
二、基础导入方式
2.1 INSERT INTO VALUES
适用于少量数据的快速插入,语法简单直观:
INSERT INTO table_name [WITH LABEL label_name]
VALUES (value1, value2, ...), (value1, value2, ...), ...;
示例:
INSERT INTO source_wiki_edit
WITH LABEL insert_load_wikipedia
VALUES
("2015-09-12 00:00:00","#en.wikipedia","AustinFF",0,0,0,0,0,21,5,0),
("2015-09-12 00:00:00","#ca.wikipedia","helloSR",0,1,0,1,0,3,23,0);
特点:
- 适合测试和小批量数据验证
- 每条数据需要明确指定所有列值
- 性能较低,不适合大规模数据导入
2.2 INSERT INTO SELECT
将查询结果导入目标表,支持复杂的数据转换:
INSERT INTO table_name [PARTITION(p1,p2,...)] [WITH LABEL label_name]
[ (column1, column2, ...) ]
SELECT ... FROM ...;
示例:
-- 全表导入
INSERT INTO insert_wiki_edit
WITH LABEL insert_load_wikipedia_1
SELECT * FROM source_wiki_edit;
-- 指定分区导入
INSERT INTO insert_wiki_edit PARTITION(p06, p12)
WITH LABEL insert_load_wikipedia_2
SELECT * FROM source_wiki_edit;
-- 部分列导入
INSERT INTO insert_wiki_edit
WITH LABEL insert_load_wikipedia_3
(event_time, channel)
SELECT event_time, channel FROM source_wiki_edit;
特点:
- 支持数据转换和过滤
- 可以从多表关联查询结果导入
- 支持指定目标列和分区
三、高级导入功能
3.1 覆盖写入 (INSERT OVERWRITE)
StarRocks 2.4 版本引入的覆盖写入功能,通过临时分区机制实现原子性覆盖:
INSERT OVERWRITE table_name [PARTITION(p1,p2,...)] [WITH LABEL label_name]
[ (column1, column2, ...) ]
VALUES/SELECT ...;
实现原理:
- 为目标分区创建临时分区
- 将数据写入临时分区
- 使用临时分区原子替换目标分区
示例:
-- 覆盖全表
INSERT OVERWRITE insert_wiki_edit
WITH LABEL insert_load_wikipedia_ow_1
SELECT * FROM source_wiki_edit;
-- 覆盖指定分区
INSERT OVERWRITE insert_wiki_edit PARTITION(p06, p12)
WITH LABEL insert_load_wikipedia_ow_2
SELECT * FROM source_wiki_edit;
3.2 Dynamic Overwrite (3.4+)
v3.4 引入的新特性,提供更灵活的覆盖行为:
-- 启用会话级Dynamic Overwrite
SET dynamic_overwrite = true;
-- 或使用Hint仅对当前语句生效
INSERT /*+set_var(dynamic_overwrite = true)*/ OVERWRITE table_name
SELECT ...;
特点:
- 未覆盖的分区数据会保留
- 自动创建新分区
- 更符合用户预期的覆盖行为
3.3 外部文件直接导入
v3.1 开始支持通过 FILES() 函数直接导入云存储或 HDFS 文件:
INSERT INTO table_name
SELECT * FROM FILES(
"path" = "s3://bucket/path/file.parquet",
"format" = "parquet",
"aws.s3.access_key" = "your_key",
"aws.s3.secret_key" = "your_secret",
"aws.s3.region" = "region"
);
v3.4 增强:
- 支持严格模式和容错率设置
- 支持不合格数据处理方式选择
INSERT INTO table_name
PROPERTIES(
"strict_mode" = "true",
"max_filter_ratio" = "0.1"
)
SELECT * FROM FILES(...);
四、生成列导入
生成列的值由表达式自动计算得出,导入时只需提供基础列:
CREATE TABLE table_with_gc (
id INT,
data_array ARRAY<INT>,
data_json JSON,
avg_array DOUBLE AS array_avg(data_array),
get_string VARCHAR AS get_json_string(json_string(data_json), '$.a')
);
-- 只需插入基础列
INSERT INTO table_with_gc
VALUES (1, [1,2], parse_json('{"a" : 1, "b" : 2}'));
五、最佳实践与注意事项
-
性能考虑:
- 避免频繁小批量INSERT操作
- 大批量数据建议使用Stream Load或Routine Load
- 合理设置分区和分桶策略
-
错误处理:
- 使用
enable_insert_strict
控制严格模式 - 为重要作业指定Label以便追踪
- 监控导入任务状态
- 使用
-
资源管理:
- 大作业考虑使用SUBMIT TASK异步执行
- 控制单次导入数据量
-
版本特性:
- 不同版本功能有差异,注意兼容性
- 新版本提供更多优化选项
六、总结
StarRocks 的 INSERT 语句提供了灵活多样的数据导入方式,从简单的值插入到复杂的外部数据导入,满足不同场景需求。理解各种导入方式的特性和适用场景,可以帮助开发者构建更高效的数据管道。随着版本迭代,StarRocks 不断优化 INSERT 语句的功能和性能,建议用户关注版本更新,充分利用新特性提升数据导入效率。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考