EXPORT

更新时间:
复制为 MD 格式

EXPORT 是云数据库 SelectDB 版提供的异步数据导出能力。提交任务后立即返回,由系统在后台将整张内表、指定分区或外表数据按指定文件格式写入 OSS 或 HDFS。本文介绍命令的适用范围、典型示例和操作要点。

适用场景

EXPORT 面向以下两类需求:

  • 把整张表或指定分区一次性下沉到对象存储或 HDFS,过滤条件简单或不需要复杂计算。

  • 作业可以异步排队执行,由 EXPORT 后台调度、客户端只需轮询状态,不需要保持长连接。

使用限制

  • 不支持将文本格式的输出文件压缩。

  • 不支持以 SELECT 查询结果作为导出源。如果需要落盘任意 SELECT 结果,请改用 SELECT INTO OUTFILE。

  • 单次任务最多覆盖 2000 个分区,超出需要联系技术支持调整 FE 参数 maximum_number_of_export_partitions

  • delete_existing_files 默认禁用。如需启用,请提交工单联系技术支持。

EXPORT 与 SELECT INTO OUTFILE / MySQL Dump 对比

对比维度

SELECT INTO OUTFILE

EXPORT

MySQL Dump

执行模式

同步阻塞

异步排队,提交后立即返回,可用 SHOW EXPORT 查询进度

同步阻塞

导出来源

任意 SELECT 结果集

指定的表、分区或外表

指定的库或表

指定分区

支持(在 SELECT 子句中表达)

支持(PARTITION 子句)

不支持

指定 Tablet

支持

不支持

不支持

并发能力

取决于 SQL 是否含 ORDER BY 等单机算子

支持 Tablet 粒度并行

单线程

输出格式

Parquet、ORC、CSV

Parquet、ORC、CSV(含 csv_with_names 等变体)

MySQL Dump 专有格式

外表

支持

支持 External Catalog 中的表

不支持

视图

支持

支持逻辑视图

支持

输出位置

对象存储、HDFS

对象存储、HDFS

本地文件系统

导出说明

支持导出的对象

  • SelectDB 内表(DUPLICATE / UNIQUE / AGGREGATE 三种数据模型均可)。

  • SelectDB 逻辑视图。

  • External Catalog 注册的外表(例如 Hive Metastore Catalog 中的表)。

支持的导出位置

  • 对象存储:阿里云 OSS、Amazon S3、腾讯云 COS、华为云 OBS、Google GCS。统一通过 WITH S3 子句和 s3.* 属性键描述。

  • HDFS:含开启 NameNode 高可用与 Kerberos 认证的集群。通过 WITH HDFS 子句配置。

支持的导出文件格式

  • Parquet

  • ORC

  • csv(默认)

  • csv_with_names(首行携带列名)

  • csv_with_names_and_types(首行列名 + 第二行列类型)

快速上手

建表与写入数据

CREATE TABLE IF NOT EXISTS demo.tbl (
    `c1` INT NULL,
    `c2` STRING NULL,
    `c3` BIGINT NULL
)
DISTRIBUTED BY HASH(c1) BUCKETS 4;

INSERT INTO demo.tbl VALUES
    (1, 'doris', 18),
    (2, 'nereids', 20),
    (3, 'pipeline', 99999),
    (4, 'Apache', 122123455),
    (5, NULL, NULL);

导出到阿里云 OSS

将 demo.tbl 整表写入 OSS Bucket,使用默认 csv 格式:

EXPORT TABLE demo.tbl TO "oss://<your_bucket>/export/tbl_"
PROPERTIES (
    "line_delimiter" = ","
)
WITH S3 (
    "s3.endpoint" = "oss-cn-hangzhou-internal.aliyuncs.com",
    "s3.region" = "oss-cn-hangzhou",
    "s3.access_key" = "<your_access_key_id>",
    "s3.secret_key" = "<your_access_key_secret>"
);
  • 路径协议:阿里云 OSS 推荐使用 oss://;同时也兼容 s3://

  • 子句关键字:无论路径协议是 oss 还是 s3,凭证子句都用 WITH S3,属性键固定为 s3.endpoints3.regions3.access_keys3.secret_key。SelectDB v4 中尚未提供 WITH OSS 关键字。

  • Endpoint:实例与 OSS 在同一地域时,使用内网 endpoint(如 oss-cn-hangzhou-internal.aliyuncs.com),可避免公网流量费并加快传输。

导出到 HDFS

将 demo.tbl 写入 HDFS,并自定义列分隔符。fs.defaultFS 与目标路径中的 host:port 需替换为真实可达的 NameNode 地址(例如同 VPC 内 EMR 集群 Master 节点的 FQDN):

EXPORT TABLE demo.tbl TO "hdfs://<namenode_host>:9000/path/to/tbl_"
PROPERTIES (
    "format" = "csv",
    "column_separator" = ","
)
WITH HDFS (
    "fs.defaultFS" = "hdfs://<namenode_host>:9000",
    "hadoop.username" = "hadoop"
);
  • SelectDB 实例与 HDFS 集群必须在同一 VPC 中。如使用阿里云 EMR,可在 EMR 集群「访问链接与端口」中获取 NameNode FQDN。

  • hadoop.username 取值需与 HDFS 目标目录的写权限匹配,常用 hadoophdfs

  • 导出完成后,可通过 SELECT * FROM HDFS("uri"="hdfs://<namenode_host>:9000/path/to/tbl_*", ...) 表函数反向校验写入内容。

查询导出任务

EXPORT 提交后立即返回,必须用 SHOW EXPORT 跟踪后续状态:

SHOW EXPORT FROM demo ORDER BY CreateTime DESC LIMIT 10;

主要列含义:

  • State:任务进入 PENDING(排队)→ EXPORTING(执行中)→ FINISHED(完成)或 CANCELLED(被取消/失败)。

  • Progress:百分比进度。

  • Path:用户提交的目标前缀。

  • OutfileInfo:FINISHED 后填充,列出每个输出文件的行数、字节数和最终 URL。

  • ErrorMsg:失败时的错误信息,可据此排查权限、路径或网络问题。

取消导出任务

在 PENDING 或 EXPORTING 阶段可以撤销作业,常见用法是按 Label 模式匹配:

CANCEL EXPORT FROM demo WHERE LABEL like "%export_%";

导出示例

导出到开启高可用的 HDFS 集群

HA 模式下需要把 nameservices 与各 NameNode 的 RPC 地址都写在 WITH HDFS 中。dfs.nameservices 的值必须与 fs.defaultFS 中的逻辑名一致,否则会报 Missing property: dfs.namenode.rpc-address.* (expected format: host:port)

EXPORT TABLE demo.tbl TO "hdfs://my-ns/path/to/tbl_"
PROPERTIES (
    "line_delimiter" = ","
)
WITH HDFS (
    "fs.defaultFS" = "hdfs://my-ns",
    "hadoop.username" = "hadoop",
    "dfs.nameservices" = "my-ns",
    "dfs.ha.namenodes.my-ns" = "nn1,nn2",
    "dfs.namenode.rpc-address.my-ns.nn1" = "nn1-host:8020",
    "dfs.namenode.rpc-address.my-ns.nn2" = "nn2-host:8020",
    "dfs.client.failover.proxy.provider.my-ns" = "org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider"
);

导出到开启高可用与 Kerberos 认证的 HDFS 集群

EXPORT TABLE demo.tbl TO "hdfs://hacluster/path/to/tbl_"
PROPERTIES (
    "line_delimiter" = ","
)
WITH HDFS (
    "fs.defaultFS" = "hdfs://hacluster/",
    "hadoop.username" = "hadoop",
    "dfs.nameservices" = "hacluster",
    "dfs.ha.namenodes.hacluster" = "n1,n2",
    "dfs.namenode.rpc-address.hacluster.n1" = "192.168.0.1:8020",
    "dfs.namenode.rpc-address.hacluster.n2" = "192.168.0.2:8020",
    "dfs.client.failover.proxy.provider.hacluster" = "org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider",
    "dfs.namenode.kerberos.principal" = "hadoop/_HOST@REALM.COM",
    "hadoop.security.authentication" = "kerberos",
    "hadoop.kerberos.principal" = "doris_test@REALM.COM",
    "hadoop.kerberos.keytab" = "/path/to/doris_test.keytab"
);

指定分区导出

仅导出 test 表的 p1、p2 分区,并通过 columns 限定输出列:

EXPORT TABLE demo.test
PARTITION (p1, p2)
TO "oss://<your_bucket>/export/test_"
PROPERTIES (
    "columns" = "k1,k2"
)
WITH S3 (
    "s3.endpoint" = "oss-cn-hangzhou-internal.aliyuncs.com",
    "s3.region" = "oss-cn-hangzhou",
    "s3.access_key" = "<your_access_key_id>",
    "s3.secret_key" = "<your_access_key_secret>"
);

导出时按条件过滤数据

仅导出满足 k1 < 50 的行,并自定义列分隔符:

EXPORT TABLE demo.test
WHERE k1 < 50
TO "oss://<your_bucket>/export/test_"
PROPERTIES (
    "columns" = "k1,k2",
    "column_separator" = ","
)
WITH S3 (
    "s3.endpoint" = "oss-cn-hangzhou-internal.aliyuncs.com",
    "s3.region" = "oss-cn-hangzhou",
    "s3.access_key" = "<your_access_key_id>",
    "s3.secret_key" = "<your_access_key_secret>"
);

导出外表数据

先注册一个 Hive Catalog,再用「catalog.库.表」三段式名称提交导出:

-- 1. 创建 Hive Catalog
CREATE CATALOG hive_catalog PROPERTIES (
    'type' = 'hms',
    'hive.metastore.uris' = 'thrift://hms_host:9083'
);

-- 2. 导出 Catalog 下的 Hive 表
EXPORT TABLE hive_catalog.sf1.lineitem TO "oss://<your_bucket>/export/lineitem_"
PROPERTIES (
    "format" = "csv",
    "max_file_size" = "1024MB"
)
WITH S3 (
    "s3.endpoint" = "oss-cn-hangzhou-internal.aliyuncs.com",
    "s3.region" = "oss-cn-hangzhou",
    "s3.access_key" = "<your_access_key_id>",
    "s3.secret_key" = "<your_access_key_secret>"
);

设置导出文件大小

通过 max_file_size 控制单个输出文件的大小上限,超出阈值会自动切分为多个文件:

EXPORT TABLE demo.test TO "oss://<your_bucket>/export/test_"
PROPERTIES (
    "format" = "parquet",
    "max_file_size" = "512MB"
)
WITH S3 (
    "s3.endpoint" = "oss-cn-hangzhou-internal.aliyuncs.com",
    "s3.region" = "oss-cn-hangzhou",
    "s3.access_key" = "<your_access_key_id>",
    "s3.secret_key" = "<your_access_key_secret>"
);

max_file_size 取值范围 5 MB ~ 2 GB;下游处理器(如 Spark、Flink)通常对超大文件不够友好,建议留在 256 MB ~ 1 GB 之间。

导出前清空导出目录

delete_existing_files 设为 true,导出会先把目标前缀下的所有文件和子目录清空,再写入新数据:

EXPORT TABLE demo.test TO "oss://<your_bucket>/export/test_"
PROPERTIES (
    "format" = "parquet",
    "max_file_size" = "512MB",
    "delete_existing_files" = "true"
)
WITH S3 (
    "s3.endpoint" = "oss-cn-hangzhou-internal.aliyuncs.com",
    "s3.region" = "oss-cn-hangzhou",
    "s3.access_key" = "<your_access_key_id>",
    "s3.secret_key" = "<your_access_key_secret>"
);
警告

该参数会真实删除外部存储中的数据。云数据库 SelectDB 版默认禁用,未额外开启时直接执行会报 Deleting existing files is not allowed. To enable this feature, you need to add `enable_delete_existing_files=true` in fe.conf。如确需启用,请提交工单联系技术支持,并自行确认目标存储的数据安全。

注意事项

  • 导出数据量

    单个 EXPORT 任务建议控制在数十 GB 以内。任务规模越大,失败重试时遗留的孤儿文件越多,扫描动作也会增加 IO 负载,可能挤占在线查询。数据量较大时按分区分多次导出。

  • 失败时的中间文件

    EXPORT 失败后已写入的中间文件不会自动清理,需要您在外部存储侧手动删除,避免后续重跑时产生混淆。

  • 超时

    作业默认有超时窗口,数据量超大时可能在窗口结束时被判失败。可在 PROPERTIES 中提高 timeout 后重新提交。

  • FE 重启或主备切换

    运行中的 EXPORT 任务如果赶上 FE 重启或 Master 切换,会被标记为失败,需要重新提交。

  • 导出后校验

    建议导出完成后将输出文件的总行数与源表对照,确认没有部分写入或文件缺失。