跳到主要内容

COPY INTO <location>

引入或更新: v1.2.647

COPY INTO 允许您将数据从表或查询中卸载到一个或多个文件中,这些文件位于以下位置之一:

  • 用户/内部/外部阶段:请参阅 什么是 Stage? 以了解 Databend 中的阶段。
  • 在存储服务中创建的存储桶或容器。

另请参阅:COPY INTO <table>

语法

COPY INTO { internalStage | externalStage | externalLocation }
FROM { [<database_name>.]<table_name> | ( <query> ) }
[ FILE_FORMAT = (
FORMAT_NAME = '<your-custom-format>'
| TYPE = { CSV | TSV | NDJSON | PARQUET } [ formatTypeOptions ]
) ]
[ copyOptions ]
[ VALIDATION_MODE = RETURN_ROWS ]
[ DETAILED_OUTPUT = true | false ]

internalStage

internalStage ::= @<internal_stage_name>[/<path>]

externalStage

externalStage ::= @<external_stage_name>[/<path>]

externalLocation

externalLocation ::=
's3://<bucket>[<path>]'
CONNECTION = (
<connection_parameters>
)

有关访问 Amazon S3-like 存储服务的连接参数,请参阅 连接参数

FILE_FORMAT

详情请参阅 输入 & 输出文件格式

copyOptions

copyOptions ::=
[ SINGLE = true | false ]
[ MAX_FILE_SIZE = <num> ]
[ OVERWRITE = true | false ]
[ INCLUDE_QUERY_ID = true | false ]
[ USE_RAW_PATH = true | false ]
参数默认值描述
SINGLEfalsetrue 时,命令将数据卸载到一个单一文件中。
MAX_FILE_SIZE67108864 bytes (64 MB)每个文件的最大大小(以字节为单位)。当 SINGLE 为 false 时有效。
OVERWRITEfalsetrue 时,目标路径中同名现有文件将被覆盖。注意:OVERWRITE = true 需要 USE_RAW_PATH = trueINCLUDE_QUERY_ID = false
INCLUDE_QUERY_IDtruetrue 时,导出的文件名中将包含一个唯一的 UUID。
USE_RAW_PATHfalsetrue 时,将使用用户提供的精确路径(包括完整文件名)来导出数据。如果设置为 false,用户必须提供一个目录路径。

DETAILED_OUTPUT

确定是否应返回数据卸载的详细结果,默认值为 false。更多信息请参阅 输出

输出

COPY INTO 提供数据卸载结果的摘要,包含以下列:

描述
rows_unloaded成功卸载到目标的行数。
input_bytes从源表读取的数据总大小(以字节为单位)。
output_bytes写入目标的数据总大小(以字节为单位)。

DETAILED_OUTPUT 设置为 true 时,COPY INTO 提供以下列的结果。这有助于定位卸载的文件,尤其是在使用 MAX_FILE_SIZE 将卸载的数据分成多个文件时。

描述
file_name卸载文件的名称。
file_size卸载文件的大小(以字节为单位)。
row_count卸载文件中包含的行数。

示例

在本节中,提供的示例使用了以下表和数据:

-- 创建示例表
CREATE TABLE canadian_city_population (
city_name VARCHAR(50),
population INT
);

-- 插入示例数据
INSERT INTO canadian_city_population (city_name, population)
VALUES
('Toronto', 2731571),
('Montreal', 1704694),
('Vancouver', 631486),
('Calgary', 1237656),
('Ottawa', 934243),
('Edmonton', 972223),
('Quebec City', 542298),
('Winnipeg', 705244),
('Hamilton', 536917),
('Halifax', 403390);

示例 1: 卸载到内部阶段

此示例将数据卸载到内部阶段:

-- 创建内部阶段
CREATE STAGE my_internal_stage;

-- 使用 PARQUET 文件格式将表中的数据卸载到阶段
COPY INTO @my_internal_stage
FROM canadian_city_population
FILE_FORMAT = (TYPE = PARQUET);

┌────────────────────────────────────────────┐
│ rows_unloaded │ input_bytes │ output_bytes │
├───────────────┼─────────────┼──────────────┤
10211572
└────────────────────────────────────────────┘

LIST @my_internal_stage;

┌────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
│ name │ size │ md5 │ last_modified │ creator │
├─────────────────────────────────────────────────────────────────┼────────┼──────────────────┼───────────────────────────────┼──────────────────┤
│ data_abe520a3-ee88-488c-9221-b07c562c9a30_0000_00000000.parquet │ 572NULL2024-01-18 16:20:48.979 +0000NULL
└────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘

示例 2: 卸载到压缩文件

此示例将数据卸载到压缩文件:

-- 创建内部阶段
CREATE STAGE my_internal_stage;

-- 使用 CSV 文件格式和 gzip 压缩将表中的数据卸载到阶段
COPY INTO @my_internal_stage
FROM canadian_city_population
FILE_FORMAT = (TYPE = CSV COMPRESSION = gzip);

┌────────────────────────────────────────────┐
│ rows_unloaded │ input_bytes │ output_bytes │
├───────────────┼─────────────┼──────────────┤
10182168
└────────────────────────────────────────────┘

LIST @my_internal_stage;

┌───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
│ name │ size │ md5 │ last_modified │ creator │
├────────────────────────────────────────────────────────────────┼────────┼──────────────────┼───────────────────────────────┼──────────────────┤
│ data_7970afa5-32e3-4e7d-b793-e42a2a82a8e6_0000_00000000.csv.gz │ 168NULL2024-01-18 16:27:01.663 +0000NULL
└───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘

-- COPY INTO 也适用于自定义文件格式。请参见下方:
-- 创建名为 my_cs_gzip 的自定义文件格式,使用 CSV 格式和 gzip 压缩
CREATE FILE FORMAT my_csv_gzip TYPE = CSV COMPRESSION = gzip;

-- 使用自定义文件格式 my_cs_gzip 将表中的数据卸载到阶段
COPY INTO @my_internal_stage
FROM canadian_city_population
FILE_FORMAT = (FORMAT_NAME = 'my_csv_gzip');

┌────────────────────────────────────────────┐
│ rows_unloaded │ input_bytes │ output_bytes │
├───────────────┼─────────────┼──────────────┤
10182168
└────────────────────────────────────────────┘

LIST @my_internal_stage;

┌───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
│ name │ size │ md5 │ last_modified │ creator │
├────────────────────────────────────────────────────────────────┼────────┼──────────────────┼───────────────────────────────┼──────────────────┤
│ data_d006ba1c-0609-46d7-a67b-75c7078d86ff_0000_00000000.csv.gz │ 168NULL2024-01-18 16:29:29.721 +0000NULL
│ data_7970afa5-32e3-4e7d-b793-e42a2a82a8e6_0000_00000000.csv.gz │ 168NULL2024-01-18 16:27:01.663 +0000NULL
└───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘

示例 3:卸载到桶

此示例将数据卸载到 MinIO 上的一个桶中:

-- 将数据从表中卸载到 MinIO 上名为 'databend' 的桶中,使用 PARQUET 文件格式
COPY INTO 's3://databend'
CONNECTION = (
ENDPOINT_URL = 'http://localhost:9000/',
ACCESS_KEY_ID = 'ROOTUSER',
SECRET_ACCESS_KEY = 'CHANGEME123',
region = 'us-west-2'
)
FROM canadian_city_population
FILE_FORMAT = (TYPE = PARQUET);

┌────────────────────────────────────────────┐
│ rows_unloaded │ input_bytes │ output_bytes │
├───────────────┼─────────────┼──────────────┤
10211572
└────────────────────────────────────────────┘

Alt text