COPY
COPY TABLE
COPY TO
COPY TO 被用来将表的内容导出到文件中,其语法如下:
COPY tbl TO '/xxx/xxx/output.parquet' WITH (FORMAT = 'parquet');
命令以 COPY 关键字开始,后面跟着要导出数据的表名(本例中为 tbl)。
TO 指定导出数据的文件路径和名称(本例中为 /xxx/xxx/output.parquet)。
导出的文件会生成在执行该查询的 GreptimeDB 服务端节点上,而不是发起 SQL 的客户端机器上。请确保路径在服务端可访问且可写,或使用 CONNECTION 导出到 S3、GCS、Azure Blob Storage 等云存储服务。
在单机部署模式下,本地文件路径受限于 storage.copy_root 目录(默认为 <data_home>/copy);在分布式部署模式下,本地文件访问被完全禁止。详情请参阅迁移本地 SQL 文件访问。
例如,可以使用自定义时间戳和日期格式导出数据到 CSV 或 JSON 文件:
COPY tbl TO '/path/to/file.csv' WITH (
FORMAT = 'csv',
TIMESTAMP_FORMAT = '%Y/%m/%d %H:%M:%S',
DATE_FORMAT = '%Y-%m-%d'
);
COPY tbl TO '/path/to/file.json' WITH (
FORMAT = 'json',
TIMESTAMP_FORMAT = '%Y/%m/%d %H:%M:%S',
DATE_FORMAT = '%Y-%m-%d'
);
也可以将数据导出为压缩的 CSV 或 JSON 文件:
COPY tbl TO '/path/to/file.csv.gz' WITH (
FORMAT = 'csv',
COMPRESSION_TYPE = 'gzip'
);
使用压缩时,请确保文件扩展名与压缩类型匹配:gzip 使用 .gz,zstd 使用 .zst,bzip2 使用 .bz2,xz 使用 .xz。
WITH 选项
WITH 可以添加一些选项,比如文件的 FORMAT 用来指定导出文件的格式。本例中的格式为 Parquet,它是一种用于大数据处理的列式存储格式。Parquet 为大数据分析高效地压缩和编码列式数据。
| 选项 | 描述 | 是否必需 |
|---|---|---|
FORMAT | 目标文件格式,例如 JSON, CSV, Parquet | 是 |
START_TIME/END_TIME | 需要导出数据的时间范围,时间范围为左闭右开 | 可选 |
COMPRESSION_TYPE | 导出文件的压缩算法。支持的值:gzip、zstd、bzip2、xz。仅支持 CSV 和 JSON 格式。 | 可选 |
TIMESTAMP_FORMAT | 导出 CSV 或 JSON 格式时自定义时间戳列的格式。使用 strftime 格式说明符(例如 '%Y-%m-%d %H:%M:%S')。支持 CSV 和 JSON 格式。 | 可选 |
DATE_FORMAT | 导出 CSV 或 JSON 格式时自定义日期列的格式。使用 strftime 格式说明符(例如 '%Y-%m-%d')。支持 CSV 和 JSON 格式。 | 可选 |
TIME_FORMAT | 导出 CSV 或 JSON 格式时自定义时间列的格式。使用 strftime 格式说明符(例如 '%H:%M:%S')。支持 CSV 和 JSON 格式。 | 可选 |
CONNECTION 选项
COPY TO 支持导出数据到云存储上。详情请参考 连接 S3、连接 GCS 或 连接 Azure Blob Storage。
COPY FROM
COPY FROM 被用来将文件中的数据导入到表中,其语法如下:
COPY [<db>.]<table_name>
FROM { '<path>/[<filename>]' }
[ [ WITH ]
(
[ FORMAT = { 'CSV' | 'JSON' | 'PARQUET' | 'ORC' } ]
[ PATTERN = '<regex_pattern>' ]
)
]
[LIMIT NUM]
命令以 COPY 关键字开始,后面跟着要导入数据的表名。
WITH 选项
FORMAT 指定导入文件的格式,本例中为 Parquet。
选项 PATTERN 允许使用通配符(如 *)指定匹配某种模式的多个输入文件。例如,你可以使用以下语法导入目录(必须是绝对路径)"/path/to/folder" 中文件名包含 parquet 的所有文件:
COPY tbl FROM '/path/to/folder/' WITH (FORMAT = 'parquet', PATTERN = '.*parquet.*');
例如,如果你只有一个文件需要导入,可以使用下方的语法:
COPY tbl FROM '/path/to/folder/xxx.parquet' WITH (FORMAT = 'parquet');
也可以从压缩的 CSV 或 JSON 文件导入数据:
COPY tbl FROM '/path/to/file.csv.gz' WITH (
FORMAT = 'csv',
COMPRESSION_TYPE = 'gzip'
);
导入 CSV 数据时,可以设置 SKIP_BAD_RECORDS = 'true' 跳过解析或类型转换错误的行并继续导入:
COPY tbl FROM '/path/to/file.csv' WITH (
FORMAT = 'csv',
SKIP_BAD_RECORDS = 'true'
);
| 选项 | 描述 | 是否必需 |
|---|---|---|
FORMAT | 目标文件格式,例如 JSON, CSV, Parquet, ORC | 是 |
PATTERN | 使用正则匹配文件,例如 *_today.parquet | 可选 |
COMPRESSION_TYPE | 导入文件的压缩算法。支持的值:gzip、zstd、bzip2、xz。仅支持 CSV 和 JSON 格式。 | 可选 |
HEADERS | CSV 文件是否包含表头。支持的值:true、false。默认值为 true。 | 可选 |
SKIP_BAD_RECORDS | 导入 CSV 时是否跳过解析或类型转换错误的行。支持的值:true、false。默认值为 false。仅支持 CSV 格式。 | 可选 |
STRICT_HEADERS | 导入前是否根据表结构校验 CSV 表头。支持的值:true、false。默认值为 false。仅支持 CSV 格式,且要求 HEADERS = 'true'。 | 可选 |
默认情况下,CSV 会按包含表头的方式解析,并按列名匹配表字段。
如果要导入不包含表头的 CSV 文件,请设置 HEADERS = 'false'。此时会按目标表的字段顺序进行 位置映射。你可以使用 SHOW CREATE TABLE <table_name> 查看表字段顺序。
STRICT_HEADERS 选项
默认的表头匹配是宽松的:表里没有的 CSV 列会被忽略,CSV 里没有的表字段则走正常的插入和默认值处理。
设置 STRICT_HEADERS = 'true' 会在读取数据之前先校验表头。出现以下任一情况都会导入失败:
- CSV 里有表中不存在的列;
- 表中有 CSV 里没有的列;
- CSV 表头里有重复的列名。
COPY monitor FROM 'monitor.csv' WITH (FORMAT = 'CSV', STRICT_HEADERS = 'true');
不匹配时会一次性报出三类问题:
ERROR: CSV header mismatch in path: monitor.csv, unknown columns: ["extra"], missing columns: [], duplicate columns: []
缺列检查针对表的全部列,包括可空列和有默认值的列。CSV 少了其中任何一列都会被拒绝。
STRICT_HEADERS = 'true' 不能和 HEADERS = 'false' 同时使用——无表头的 CSV 没有表头可校验,这个组合会返回 strict_headers=true requires headers=true。
Connection 选项
COPY FROM 同样支持从云存储上导入数据。详情请参考 连接 S3、连接 GCS 或 连接 Azure Blob Storage。
LIMIT 选项
可以通过 LIMIT 手动限制一次插入的最大行数。