STREAM LOAD
STREAM LOAD 允许您从本地文件系统或流式数据源导入数据。提交导入作业后,系统会同步运行该作业,并在作业完成后返回作业结果。您可以根据作业结果判断作业是否成功。有关 Stream Load 的应用场景、限制和支持的数据文件格式的信息,请参阅通过 Stream Load 从本地文件系统导入数据。
从 v3.2.7 版本开始,Stream Load 支持在传输过程中压缩 JSON 数据,从而减少网络带宽开销。用户可以使用参数指定不同的压缩算法 compression 和 Content-Encoding。支持的压缩算法包括 GZIP、BZIP2、LZ4_FRAME 和 ZSTD。有关更多信息,请参阅data_desc。
从 v3.4.0 版本开始,系统支持合并多个 Stream Load 请求。有关更多信息,请参阅Merge Commit 参数。
- 使用 Stream Load 将数据导入到内表后,在该表上创建的物化视图的数据也会同步更新。
- 您只能以对当前内表具有 INSERT 权限的用户身份将数据导入到内表。如果您没有 INSERT 权限,请按照中提供的说明操作GRANT,将 INSERT 权限授予连接集群的用户。
语法
curl --location-trusted -u <username>:<password> -XPUT <url>
(
data_desc
)
[opt_properties]
本文使用 curl 作为示例来描述如何使用 Stream Load 导入数据。除了 curl 之外,您还可以使用其他 HTTP 兼容的工具或语言执行 Stream Load。导入相关参数包含在 HTTP 请求Header中。输入这些参数时,请注意以下几点:
-
您可以使用分块传输编码,如本主题所示。如果您不选择分块传输编码,则必须输入一个
Content-LengthHeader 以指示要传输内容的长度,从而确保数据完整性。备注如果您使用
curl执行 Stream Load,系统会自动添加一个Content-LengthHeader,您无需手动输入。 -
您必须添加一个
ExpectHeader 并将其值指定为100-continue,例如"Expect:100-continue"。这有助于防止不必要的数据传输,并在您的作业请求被拒绝时减少资源开销。
请注意,在 StarRocks 中,某些词被 SQL 语言用作保留关键字。请勿在 SQL 语句中直接使用这些关键字。如果您想在 SQL 语句中使用此类关键字,请将其用一对反引号 (`) 括起来。请参阅关键字。
参数
用户名和密码
指定用于连接集群的账户的用户名和密码。这是一个必需参数。如果您使用的账户未设置密码,则只需输入 <username>:。
XPUT
指定 HTTP 请求方法。这是一个必需参数。Stream Load 仅支持 PUT 方法。
url
指定表的 URL。语法:
http://<fe_host>:<fe_http_port>/api/<database_name>/<table_name>/_stream_load
下表描述了 URL 中的参数。
| 参数 | 是否必填 | 描述 |
|---|---|---|
| fe_host | 是 | 集群中 FE 节点的 IP 地址。 注意 如果您将导入作业提交到特定的 BE 或 CN 节点,则必须输入该 BE 或 CN 节点的 IP 地址。 |
| fe_http_port | 是 | 集群中 FE 节点的 HTTP 端口号。默认端口号为 8030。注意 如果您将导入作业提交到特定的 BE 或 CN 节点,则必须输入该 BE 或 CN 节点的 HTTP 端口号。默认端口号为 8030。 |
| database_name | 是 | 表所属的数据库名称。 |
| table_name | 是 | 表的名称。 |
您可以使用 SHOW FRONTENDS 来查看 FE 节点的 IP 地址和 HTTP 端口。
data_desc
描述您要导入的数据文件。data_desc 描述符可以包含数据文件的名称、格式、列分隔符、行分隔符、目标分区以及与表的列映射。语法:
-T <file_path>
-H "format: CSV | JSON"
-H "column_separator: <column_separator>"
-H "row_delimiter: <row_delimiter>"
-H "columns: <column1_name>[, <column2_name>, ... ]"
-H "partitions: <partition1_name>[, <partition2_name>, ...]"
-H "temporary_partitions: <temporary_partition1_name>[, <temporary_partition2_name>, ...]"
-H "jsonpaths: [ \"<json_path1>\"[, \"<json_path2>\", ...] ]"
-H "strip_outer_array: true | false"
-H "json_root: <json_path>"
-H "ignore_json_size: true | false"
-H "compression: <compression_algorithm> | Content-Encoding: <compression_algorithm>"
其中的参数 data_desc 描述符可分为三种类型:通用参数、CSV 参数和 JSON 参数。
通用参数
| 参数名称 | 是否必选 | 参数说明 |
|---|---|---|
| file_path | 是 | 指定源数据文件的保存路径。文件名里可选包含或者不包含扩展名。 |
| format | 否 | 指定待导入数据的格式。取值包括 CSV 和 JSON。默认值:CSV。 |
| partitions | 否 | 指定要把数据导入哪些分区。如果不指定该参数,则默认导入到表所在的所有分区中。 |
| temporary_partitions | 否 | 指定要把数据导入哪些临时分区。 |
| columns | 否 | 指定源数据文件和表之间的列对应关系。如果源数据文件中的列与表中的列按顺序一一对应,则不需要指定 columns 参数。您可以通过 columns 参数实现数据转换。例如,要导入一个 CSV 格式的数据文件,文件中有两列,分别可以对应到目标表的 id 和 city 两列。如果要实现把数据文件中第一列的数据乘以 100 以后再落入表的转换,可以指定 "columns: city,tmp_id, id = tmp_id * 100"。具体请参见本文“列映射”章节。 |
CSV 参数
| 参数名称 | 是否必选 | 参数说明 |
|---|---|---|
| column_separator | 否 | 用于指定源数据文件中的列分隔符。如果不指定该参数,则默认为 \t,即 Tab。必须确保这里指定的列分隔符与源数据文件中的列分隔符一致。说明 - 系统支持设置长度最大不超过 50 个字节的 UTF-8 编码字符串作为列分隔符,包括常见的逗号 (,)、Tab 和 Pipe (|)。- 若数据文件使用连续的不可打印字符(例如 \r\n)作为列分隔符,则必须将此参数设置为 \\x0D0A。 |
| row_delimiter | 否 | 用于指定源数据文件中的行分隔符。如果不指定该参数,则默认为 \n。注意 如果数据文件使用连续的不可打印字符(例如 \r\n)作为行分隔符,则必须将此参数设置为 \\x0D0A。 |
| skip_header | 否 | 用于指定跳过 CSV 文件最开头的几行数据。取值类型:INTEGER。默认值:0。在某些 CSV 文件里,最开头的几行数据会用来定义列名、列类型等元数据信息。通过设置该参数,可以使系统在导入数据时忽略 CSV 文件的前面几行。例如,如果设置该参数为 1,则系统会在导入数据时忽略 CSV 文件的第一行。这里的行所使用的分隔符须与您在导入命令中所设定的行分隔符一致。 |
| trim_space | 否 | 用于指定是否去除 CSV 文件中列分隔符前后的空格。取值类型:BOOLEAN。默认值:false。有些数据库在导出数据为 CSV 文件时,会在列分隔符的前后添加一些空格。根据位置的不同,这些空格可以称为“前导空格”或者“尾随空格”。通过设置该参数,可以使系统在导入数据时删除这些不必要的空格。 需要注意的是,系统不会去除被 enclose 指定字符括起来的字段内的空格(包括字段的前导空格和尾随空格)。例如,列分隔符是竖线 (|),enclose 指定的字符是双引号 ("):|"Love StarRocks"| |" Love StarRocks "| | "Love StarRocks" | 如果设置 trim_space 为 true,则系统处理后的结果数据如下:|"Love StarRocks"| |" Love StarRocks "| |"Love StarRocks"| |
| enclose | 否 | 根据 RFC4180,用于指定把 CSV 文件中的字段括起来的字符。取值类型:单字节字符。默认值:NONE。最常用 enclose 字符为单引号 (') 或双引号 (")。被 enclose 指定字符括起来的字段内的所有特殊字符(包括行分隔符、列分隔符等)均看做是普通符号。比 RFC4180 标准更进一步的是,系统提供的 enclose 属性支持设置任意单个字节的字符。如果一个字段内包含了 enclose 指定字符,则可以使用同样的字符对 enclose 指定字符进行转义。例如,在设置了enclose 为双引号 (") 时,字段值 a "quoted" c 在 CSV 文件中应该写作 "a ""quoted"" c"。 |
| escape | 否 | 指定用于转义的字符。用来转义各种特殊字符,比如行分隔符、列分隔符、转义符、enclose 指定字符等,使系统把这些特殊字符当做普通字符而解析成字段值的一部分。取值类型:单字节字符。默认值:NONE。最常用的 escape 字符为斜杠 (\),在 SQL 语句中应该写作双斜杠 (\\)。说明 escape 指定字符同时作用于 enclose 指定字符的内部和外部。以下为两个示例:
|
- 对于 CSV 数据,您可以使用 UTF-8 字符串(例如逗号 (,)、制表符或竖线 (|))作为文本分隔符,其长度不超过 50 字节。
- 空值通过使用
\N表示。例如,一个数据文件包含三列,其中一条记录在第一列和第三列有数据,但在第二列没有数据。在这种情况下,您需要在第二列使用\N来表示空值。这意味着该记录必须编译为a,\N,b而不是a,,b。a,,b表示该记录的第二列包含一个空字符串。 - 格式选项,包括
skip_header、trim_space