从本地文件系统导入数据
StarRocks 提供了两种从本地文件系统导入数据的方法:
- 使用 Stream Load 的同步导入
- 使用 Broker Load 的异步导入
每种选项都有其自身的优势:
- Stream Load 支持 CSV 和 JSON 文件格式。如果您想从少量文件中导入数据,并且每个文件 的大小不超过 10 GB,建议使用此方法。
- Broker Load 支持 Parquet、ORC、CSV 和 JSON 文件格式(从 v3.2.3 开始支持 JSON 文件格式)。如果您想从大量文件中导入数据,并且每个文件的大小超过 10 GB,或者文件存储在网络附加存储(NAS)设备中,建议使用此方法。从 v2.5 开始支持使用 Broker Load 从本地文件系统导入数据。
对于 CSV 数据,请注意以下几点:
- 您可以使用 UTF-8 字符串作为文本分隔符,例如逗号(,)、制表符或管道符(|),其长度不超过 50 字节。
- 空值用
\N表示。例如,一个数据文件由三列组成,其中一条记录在第一列和第三列有数据,但第二列没有数据。在这种情况下,您需要在第二列使用\N表示空值。这意味着记录必须编写为a,\N,b而不是a,,b。a,,b表示记录的第二列包含一个空字符串。
Stream Load 和 Broker Load 都支持在数据导入时进行数据转换,并支持在数据导入时通过 UPSERT 和 DELETE 操作进行数据更改。有关更多信息,请参见 在导入时转换数据 和 通过导入更改数据。
开始之前
检查权限
导入操作需要目标表的 INSERT 权限。如果您的用户账号没有 INSERT 权限,请参考 GRANT 给用户赋权,语法为 GRANT INSERT ON TABLE <table_name> IN DATABASE <database_name> TO { ROLE <role_name> | USER <user_identity>}。
检查网络配置
确保您要导入数据的机器可以通过 http_port(默认:8030)和 be_http_port(默认:8040)访问 StarRocks 集群的 FE 和 BE 节点。
通过 Stream Load 从本地文件系统导入
Stream Load 是一种基于 HTTP PUT 的同步导入方法。在您提交导入作业后,StarRocks 会同步运行该作业,并在作业完成后返回结果。您可以根据作业结果判断作业是否成功。
注意
当您使用 Stream Load 将数据导入 StarRocks 表后,该表上创建的物化视图的数据也会被更新。
工作原理
您可以根据 HTTP 在客户端上向 FE 提交导入请求,然后 FE 使用 HTTP 重定向将 导入请求转发到特定的 BE 或 CN。您也可以直接在客户端上向您选择的 BE 或 CN 提交导入请求。
如果您将导入请求提交给 FE,FE 会使用轮询机制决定哪个 BE 或 CN 将作为协调者接收和处理导入请求。轮询机制有助于实现 StarRocks 集群内的负载均衡。因此,我们建议您将导入请求发送给 FE。
接收导入请求的 BE 或 CN 作为协调者 BE 或 CN,基于使用的 schema 将数据拆分为多个部分,并将每个部分的数据分配给其他参与的 BE 或 CN。导入完成后,协调者 BE 或 CN 将导入作业的结果返回给您的客户端。请注意,如果您在导入过程中停止协调者 BE 或 CN,导入作业将失败。
下图显示了 Stream Load 作业的工作流程。

限制
Stream Load 不支持导入包含 JSON 格式列的 CSV 文件的数据。
典型示例
本节使用 curl 作为示例,描述如何将 CSV 或 JSON 文件的数据从本地文件系统导入到 StarRocks。有关详细的语法和参数说明,请参见 STREAM LOAD。
请注意,在 StarRocks 中,某些字面量被 SQL 语言用作保留关键字。不要在 SQL 语句中直接使用这些关键字。如果您想在 SQL 语句中使用此类关键字,请将其用一对反引号(`)括起来。参见 关键字。
导入 CSV 数据
准备数据集
在您的本地文件系统中,创建一个名为 example1.csv 的 CSV 文件。该文件由三列组成,依次表示用户 ID、用户名和用户分数。
1,Lily,23
2,Rose,23
3,Alice,24
4,Julia,25
创建数据库和表
创建一个数据库并切换到该数据库:
CREATE DATABASE IF NOT EXISTS mydatabase;
USE mydatabase;
创建一个名为 table1 的主键表。该表由三列组成:id、name 和 score,其中 id 是主键。
CREATE TABLE `table1`
(
`id` int(11) NOT NULL COMMENT "user ID",
`name` varchar(65533) NULL COMMENT "user name",
`score` int(11) NOT NULL COMMENT "user score"
)
ENGINE=OLAP
PRIMARY KEY(`id`)
DISTRIBUTED BY HASH(`id`);
从 v2.5.7 开始,StarRocks 可以在创建表或添加分区时自动设置桶的数量(BUCKETS)。您不再需要手动设置桶的数量。有关详细信息,请参见 设置桶的数量。
启动 Stream Load
运行以下命令将 example1.csv 的数据导入到 table1 中:
curl --location-trusted -u <username>:<password> -H "label:123" \
-H "Expect:100-continue" \
-H "column_separator:," \
-H "columns: id, name, score" \
-T example1.csv -XPUT \
http://<fe_host>:<fe_http_port>/api/mydatabase/table1/_stream_load
- 如果您使用的账户未设置密码,则只需输入
<username>:。 - 您可以使用 SHOW FRONTENDS 查看 FE 节点的 IP 地址和 HTTP 端口。
example1.csv 由三列组成,以逗号(,)分隔,并可以按顺序映射到 table1 的 id、name 和 score 列。因此,您需要使用 column_separator 参数指定逗号(,)作为列分隔符。您还需要 使用 columns 参数将 example1.csv 的三列临时命名为 id、name 和 score,并按顺序映射到 table1 的三列。
导入完成后,您可以查询 table1 以验证导入是否成功:
SELECT * FROM table1;
+------+-------+-------+
| id | name | score |
+------+-------+-------+
| 1 | Lily | 23 |
| 2 | Rose | 23 |
| 3 | Alice | 24 |
| 4 | Julia | 25 |
+------+-------+-------+
4 rows in set (0.00 sec)
导入 JSON 数据
从 v3.2.7 开始,Stream Load 支持在传输过程中压缩 JSON 数据,减少网络带宽开销。用户可以使用参数 compression 和 Content-Encoding 指定不同的压缩算法。支持的压缩算法包括 GZIP、BZIP2、LZ4_FRAME 和 ZSTD。有关语法,请参见 STREAM LOAD。
准备数据集
在您的本地文件系统中,创建一个名为 example2.json 的 JSON 文件。该文件由两列组成,依次表示城市 ID 和城市名称。
{"name": "Beijing", "code": 2}