使用 INSERT INTO FILES 卸载数据
本文介绍如何使用 INSERT INTO FILES 将数据从 StarRocks 卸载到远程存储。
自 v3.2 起,StarRocks 支持使用表函数 FILES() 在远程存储中定义一个可写文件。 然后,您可以将 FILES() 与 INSERT 语句结合使用,将数据从 StarRocks 卸载到您的远程存储。
与 StarRocks 支持的其他数据导出方法相比,使用 INSERT INTO FILES 卸载数据提供了一个更统一、易于使用的界面。 您可以使用与从远程存储加载数据相同的语法,直接将数据卸载到远程存储中。 此外,此方法支持通过提取指定列的值将数据文件存储在不同的存储路径中,从而允许您以分区布局管理导出的数据。
注意
请注意,使用 INSERT INTO FILES 卸载数据不支持直接将数据导出到本地文件系统。 但是,您可以使用 NFS 将数据导出到本地文件。 请参阅使用 NFS 卸载到本地文件。
准备工作
以下示例创建一个数据库 unload
和一个表 sales_records
作为可在以下教程中使用的数据对象。 您可以使用您自己的数据代替。
CREATE DATABASE unload;
USE unload;
CREATE TABLE sales_records(
record_id BIGINT,
seller STRING,
store_id INT,
sales_time DATETIME,
sales_amt DOUBLE
)
DUPLICATE KEY(record_id)
PARTITION BY date_trunc('day', sales_time)
DISTRIBUTED BY HASH(record_id);
INSERT INTO sales_records
VALUES
(220313001,"Amy",1,"2022-03-13 12:00:00",8573.25),
(220314002,"Bob",2,"2022-03-14 12:00:00",6948.99),
(220314003,"Amy",1,"2022-03-14 12:00:00",4319.01),
(220315004,"Carl",3,"2022-03-15 12:00:00",8734.26),
(220316005,"Carl",3,"2022-03-16 12:00:00",4212.69),
(220317006,"Bob",2,"2022-03-17 12:00:00",9515.88);
表 sales_records
包含每笔交易的交易 ID record_id
、销售员 seller
、商店 ID store_id
、时间 sales_time
和销售额 sales_amt
。 它根据 sales_time
每天进行分区。
您还需要准备一个具有写入权限的远程存储系统。 以下示例将数据导出到以下远程存储
- 启用了简单身份验证方法的 HDFS 集群。
- 使用 IAM 用户凭证的 AWS S3 存储桶。
有关 FILES() 支持的远程存储系统和凭证方法的更多信息,请参阅SQL 参考 - FILES()。
卸载数据
INSERT INTO FILES 支持将数据卸载到单个文件或多个文件中。 您还可以通过为这些数据文件指定单独的存储路径来对其进行分区。
使用 INSERT INTO FILES 卸载数据时,您必须使用属性 compression
手动设置压缩算法。 有关 FILES 支持的数据压缩算法的更多信息,请参阅unload_data_param。
将数据卸载到多个文件中
默认情况下,INSERT INTO FILES 将数据卸载到多个数据文件中,每个文件的大小为 1 GB。 您可以使用属性 target_max_file_size
配置文件大小(单位:字节)。
以下示例将 sales_records
中的所有数据行卸载为多个带有前缀 data1
的 Parquet 文件。 每个文件的大小为 1 KB。
在此,将 target_max_file_size
设置为 1 KB 是为了演示使用小型数据集卸载到多个文件。 在生产环境中,强烈建议您将此值设置在数百 MB 到多个 GB 的范围内。
- 至 S3:
INSERT INTO
FILES(
"path" = "s3://mybucket/unload/data1",
"format" = "parquet",
"compression" = "uncompressed",
"target_max_file_size" = "1024", -- 1KB
"aws.s3.access_key" = "xxxxxxxxxx",
"aws.s3.secret_key" = "yyyyyyyyyy",
"aws.s3.region" = "us-west-2"
)
SELECT * FROM sales_records;
- 至 HDFS:
INSERT INTO
FILES(
"path" = "hdfs://xxx.xx.xxx.xx:9000/unload/data1",
"format" = "parquet",
"compression" = "uncompressed",
"target_max_file_size" = "1024", -- 1KB
"hadoop.security.authentication" = "simple",
"username" = "xxxxx",
"password" = "xxxxx"
)
SELECT * FROM sales_records;
将数据卸载到不同路径下的多个文件中
您还可以通过使用属性 partition_by
提取指定列的值,在不同的存储路径中对数据文件进行分区。
以下示例将 sales_records
中的所有数据行卸载为路径 /unload/partitioned/ 下的多个 Parquet 文件。 这些文件存储在不同的子路径中,这些子路径由列 sales_time
中的值区分。
- 至 S3:
INSERT INTO
FILES(
"path" = "s3://mybucket/unload/partitioned/",
"format" = "parquet",
"compression" = "lz4",
"partition_by" = "sales_time",
"aws.s3.access_key" = "xxxxxxxxxx",
"aws.s3.secret_key" = "yyyyyyyyyy",
"aws.s3.region" = "us-west-2"
)
SELECT * FROM sales_records;
- 至 HDFS:
INSERT INTO
FILES(
"path" = "hdfs://xxx.xx.xxx.xx:9000/unload/partitioned/",
"format" = "parquet",
"compression" = "lz4",
"partition_by" = "sales_time",
"hadoop.security.authentication" = "simple",
"username" = "xxxxx",
"password" = "xxxxx"
)
SELECT * FROM sales_records;
将数据卸载到单个文件中
要将数据卸载到单个数据文件中,您必须将属性 single
指定为 true
。
以下示例将 sales_records
中的所有数据行卸载为带有前缀 data2
的单个 Parquet 文件。
- 至 S3:
INSERT INTO
FILES(
"path" = "s3://mybucket/unload/data2",
"format" = "parquet",
"compression" = "lz4",
"single" = "true",
"aws.s3.access_key" = "xxxxxxxxxx",
"aws.s3.secret_key" = "yyyyyyyyyy",
"aws.s3.region" = "us-west-2"
)
SELECT * FROM sales_records;
- 至 HDFS:
INSERT INTO
FILES(
"path" = "hdfs://xxx.xx.xxx.xx:9000/unload/data2",
"format" = "parquet",
"compression" = "lz4",
"single" = "true",
"hadoop.security.authentication" = "simple",
"username" = "xxxxx",
"password" = "xxxxx"
)
SELECT * FROM sales_records;
卸载到 MinIO
用于 MinIO 的参数与用于 AWS S3 的参数不同。
示例
INSERT INTO
FILES(
"path" = "s3://huditest/unload/data3",
"format" = "parquet",
"compression" = "zstd",
"single" = "true",
"aws.s3.access_key" = "xxxxxxxxxx",
"aws.s3.secret_key" = "yyyyyyyyyy",
"aws.s3.region" = "us-west-2",
"aws.s3.use_instance_profile" = "false",
"aws.s3.enable_ssl" = "false",
"aws.s3.enable_path_style_access" = "true",
"aws.s3.endpoint" = "http://minio:9000"
)
SELECT * FROM sales_records;
使用 NFS 卸载到本地文件
要通过 file://
协议访问 NFS 中的文件,您需要在每个 BE 或 CN 节点的同一目录下将 NAS 设备挂载为 NFS。
示例
-- Unload data into CSV files.
INSERT INTO FILES(
'path' = 'file:///home/ubuntu/csvfile/',
'format' = 'csv',
'csv.column_separator' = ',',
'csv.row_delimitor' = '\n'
)
SELECT * FROM sales_records;
-- Unload data into Parquet files.
INSERT INTO FILES(
'path' = 'file:///home/ubuntu/parquetfile/',
'format' = 'parquet'
)
SELECT * FROM sales_records;
另请参阅
- 有关 INSERT 用法的更多说明,请参阅SQL 参考 - INSERT。
- 有关 FILES() 用法的更多说明,请参阅SQL 参考 - FILES()。