下载
编译与部署
开始使用
操作手册
- 数据导入
- 表结构变更
- 物化视图
- HTTP API
- FE
- MANAGER
- Bootstrap Action
- Cancel Load Action
- Check Decommission Action
- Check Storage Type Action
- Config Action
- Connection Action
- Get DDL Statement Action
- Get Load Info Action
- Get Load State
- Get FE log file
- Get Small File
- HA Action
- Hardware Info Action
- Health Action
- Log Action
- Logout Action
- Meta Action
- Meta Action
- Meta Replay State Action
- Profile Action
- Query Detail Action
- Query Profile Action
- Row Count Action
- Session Action
- Set Config Action
- Show Data Action
- Show Meta Info Action
- Show Proc Action
- Show Runtime Info Action
- Statement Execution Action
- System Action
- Table Query Plan Action
- Table Row Count Action
- Table Schema Action
- Upload Action
- CANCEL LABEL
- Compaction Action
- CONNECTION
- getlogfile
- GET LABEL STATE
- GET TABLETS ON A PARTICULAR BE
- PROFILE
- QUERY DETAIL
- RESTORE TABLET
- SHOW DATA
- MIGRATE SINGLE TABLET TO A PARTICULAR DISK
- GET TABLETS DISTRIBUTION BETWEEN DIFFERENT DISKS
- FE
- 运维操作
- 配置文件
- 拦截规则
- 备份与恢复
- Broker
- Colocation Join
- Bucket Shuffle Join
- 动态分区
- 数据导出
- 导出查询结果集
- 分区缓存
- 权限管理
- LDAP
- 资源管理
- 查询执行的统计
- Runtime Filter
- Segment V2 升级手册
- 文件管理器
- SQL MODE
- 时区
- 变量
- 更新
- 多租户和资源划分
最佳实践
扩展功能
- 审计日志插件
- Doris On ES
- Doris output plugin
- ODBC External Table Of Doris
- Doris 插件框架
- Spark Doris Connector
- Flink Doris Connector
- DataX doriswriter
- UDF
设计文档
SQL 手册
- SQL 函数
- 日期函数
- convert_tz
- curdate
- current_timestamp
- curtime,current_time
- date_add
- date_format
- date_sub
- datediff
- day
- dayname
- dayofmonth
- dayofweek
- dayofyear
- from_days
- from_unixtime
- hour
- makedate
- minute
- month
- monthname
- now
- second
- strtodate
- time_round
- timediff
- timestampadd
- timestampdiff
- to_days
- unix_timestamp
- utc_timestamp
- week
- weekofyear
- year
- yearweek
- 地理位置函数
- 字符串函数
- 聚合函数
- bitmap 函数
- Hash函数
- Doris 窗口函数使用
- CAST
- DIGITAL_MASKING
- 日期函数
- 语法帮助
- 用户账户管理
- 集群管理
- ADMIN CANCEL REPAIR
- ADMIN CLEAN TRASH
- ADMIN CHECK TABLET
- ADMIN REPAIR
- ADMIN SET CONFIG
- ADMIN SET REPLICA STATUS
- ADMIN SHOW CONFIG
- ADMIN SHOW REPLICA DISTRIBUTION
- ADMIN SHOW REPLICA STATUS
- ADMIN SHOW DATA SKEW
- ALTER CLUSTER
- ALTER SYSTEM
- CANCEL DECOMMISSION
- CREATE CLUSTER
- CREATE FILE
- DROP CLUSTER
- DROP FILE
- ENTER
- INSTALL PLUGIN
- LINK DATABASE
- MIGRATE DATABASE
- SET LDAPADMINPASSWORD
- SHOW BACKENDS
- SHOW BROKER
- SHOW FILE
- SHOW FRONTENDS
- SHOW FULL COLUMNS
- SHOW INDEX
- SHOW MIGRATIONS
- SHOW PLUGINS
- SHOW TABLE STATUS
- SHOW TRASH
- UNINSTALL PLUGIN
- DDL
- ALTER DATABASE
- ALTER TABLE
- ALTER VIEW
- BACKUP
- CANCEL ALTER
- CANCEL BACKUP
- CANCEL RESTORE
- CREATE DATABASE
- CREATE ENCRYPTKEY
- CREATE INDEX
- CREATE MATERIALIZED VIEW
- CREATE REPOSITORY
- CREATE RESOURCE
- CREATE TABLE LIKE
- CREATE TABLE
- CREATE VIEW
- DROP DATABASE
- DROP ENCRYPTKEY
- DROP INDEX
- DROP MATERIALIZED VIEW
- DROP REPOSITORY
- DROP RESOURCE
- DROP TABLE
- DROP VIEW
- HLL
- RECOVER
- RESTORE
- SHOW ENCRYPTKEYS
- SHOW RESOURCES
- TRUNCATE TABLE
- CREATE FUNCTION
- DROP FUNCTION
- SHOW FUNCTIONS
- DML
- BROKER LOAD
- CANCEL LOAD
- DELETE
- EXPORT
- GROUP BY
- LOAD
- MINI LOAD
- MULTI LOAD
- PAUSE ROUTINE LOAD
- RESUME ROUTINE LOAD
- ROUTINE LOAD
- SHOW ALTER
- SHOW BACKUP
- SHOW CREATE FUNCTION
- SHOW CREATE ROUTINE LOAD
- SHOW DATA
- SHOW DATABASES
- SHOW DELETE
- SHOW DYNAMIC PARTITION TABLES
- SHOW EXPORT
- SHOW LOAD
- SHOW PARTITIONS
- SHOW PROPERTY
- SHOW REPOSITORIES
- SHOW RESTORE
- SHOW ROUTINE LOAD TASK
- SHOW ROUTINE LOAD
- SHOW SNAPSHOT
- SHOW TABLES
- SHOW TABLET
- SHOW TRANSACTION
- SPARK LOAD
- STOP ROUTINE LOAD
- STREAM LOAD
- ALTER ROUTINE LOAD
- INSERT
- UPDATE
- 数据类型
- 辅助命令
开发者手册
- 调试工具
- Doris BE存储层Benchmark工具
- 使用 Eclipse 搭建 FE 开发环境
- 使用 IntelliJ IDEA 搭建 FE 开发环境
- Apache Doris Be 开发调试
- Java 代码格式化
- C++ 代码格式化
Apache 社区
导出查询结果集
本文档介绍如何使用 SELECT INTO OUTFILE
命令进行查询结果的导出操作。
语法
SELECT INTO OUTFILE
语句可以将查询结果导出到文件中。目前支持通过 Broker 进程, 通过 S3 协议, 或直接通过 HDFS 协议,导出到远端存储,如 HDFS,S3,BOS,COS(腾讯云)上。语法如下
query_stmt
INTO OUTFILE "file_path"
[format_as]
[properties]
file_path
file_path
指向文件存储的路径以及文件前缀。如hdfs://path/to/my_file_
。最终的文件名将由
my_file_
,文件序号以及文件格式后缀组成。其中文件序号由0开始,数量为文件被分割的数量。如:my_file_abcdefg_0.csv my_file_abcdefg_1.csv my_file_abcdegf_2.csv
[format_as]
FORMAT AS CSV
指定导出格式。默认为 CSV。
[properties]
指定相关属性。目前支持通过 Broker 进程, 或通过 S3 协议进行导出。
- Broker 相关属性需加前缀
broker.
。具体参阅Broker 文档。 - HDFS 相关属性需加前缀
hdfs.
。 S3 协议则直接执行 S3 协议配置即可。
("broker.prop_key" = "broker.prop_val", ...) or ("hdfs.fs.defaultFS" = "xxx", "hdfs.hdfs_user" = "xxx") or ("AWS_ENDPOINT" = "xxx", ...)
其他属性:
("key1" = "val1", "key2" = "val2", ...)
目前支持以下属性:
column_separator
:列分隔符,仅对 CSV 格式适用。默认为\t
。line_delimiter
:行分隔符,仅对 CSV 格式适用。默认为\n
。max_file_size
:单个文件的最大大小。默认为 1GB。取值范围在 5MB 到 2GB 之间。超过这个大小的文件将会被切分。schema
:PARQUET 文件schema信息。仅对 PARQUET 格式适用。导出文件格式为PARQUET时,必须指定schema
。
- Broker 相关属性需加前缀
并发导出
默认情况下,查询结果集的导出是非并发的,也就是单点导出。如果用户希望查询结果集可以并发导出,需要满足以下条件:
- session variable 'enable_parallel_outfile' 开启并发导出:
set enable_parallel_outfile = true;
- 导出方式为 S3 , 或者 HDFS, 而不是使用 broker
- 查询可以满足并发导出的需求,比如顶层不包含 sort 等单点节点。(后面会举例说明,哪种属于不可并发导出结果集的查询)
满足以上三个条件,就能触发并发导出查询结果集了。并发度 = be_instacne_num * parallel_fragment_exec_instance_num
如何验证结果集被并发导出
用户通过 session 变量设置开启并发导出后,如果想验证当前查询是否能进行并发导出,则可以通过下面这个方法。
explain select xxx from xxx where xxx into outfile "s3://xxx" format as csv properties ("AWS_ENDPOINT" = "xxx", ...);
对查询进行 explain 后,Doris 会返回该查询的规划,如果你发现 RESULT FILE SINK
出现在 PLAN FRAGMENT 1
中,就说明导出并发开启成功了。 如果 RESULT FILE SINK
出现在 PLAN FRAGMENT 0
中,则说明当前查询不能进行并发导出 (当前查询不同时满足并发导出的三个条件)。
并发导出的规划示例:
+-----------------------------------------------------------------------------+
| Explain String |
+-----------------------------------------------------------------------------+
| PLAN FRAGMENT 0 |
| OUTPUT EXPRS:<slot 2> | <slot 3> | <slot 4> | <slot 5> |
| PARTITION: UNPARTITIONED |
| |
| RESULT SINK |
| |
| 1:EXCHANGE |
| |
| PLAN FRAGMENT 1 |
| OUTPUT EXPRS:`k1` + `k2` |
| PARTITION: HASH_PARTITIONED: `default_cluster:test`.`multi_tablet`.`k1` |
| |
| RESULT FILE SINK |
| FILE PATH: s3://ml-bd-repo/bpit_test/outfile_1951_ |
| STORAGE TYPE: S3 |
| |
| 0:OlapScanNode |
| TABLE: multi_tablet |
+-----------------------------------------------------------------------------+
使用示例
示例1
使用 broker 方式导出,将简单查询结果导出到文件
hdfs:/path/to/result.txt
。指定导出格式为 CSV。使用my_broker
并设置 kerberos 认证信息。指定列分隔符为,
,行分隔符为\n
。SELECT * FROM tbl INTO OUTFILE "hdfs:/path/to/result_" FORMAT AS CSV PROPERTIES ( "broker.name" = "my_broker", "broker.hadoop.security.authentication" = "kerberos", "broker.kerberos_principal" = "doris@YOUR.COM", "broker.kerberos_keytab" = "/home/doris/my.keytab", "column_separator" = ",", "line_delimiter" = "\n", "max_file_size" = "100MB" );
最终生成文件如如果不大于 100MB,则为:
result_0.csv
。如果大于 100MB,则可能为
result_0.csv, result_1.csv, ...
。示例2
将简单查询结果导出到文件
hdfs:/path/to/result.parquet
。指定导出格式为 PARQUET。使用my_broker
并设置 kerberos 认证信息。SELECT c1, c2, c3 FROM tbl INTO OUTFILE "hdfs:/path/to/result_" FORMAT AS PARQUET PROPERTIES ( "broker.name" = "my_broker", "broker.hadoop.security.authentication" = "kerberos", "broker.kerberos_principal" = "doris@YOUR.COM", "broker.kerberos_keytab" = "/home/doris/my.keytab", "schema"="required,int32,c1;required,byte_array,c2;required,byte_array,c2" );
查询结果导出到parquet文件需要明确指定
schema
。示例3
将 CTE 语句的查询结果导出到文件
hdfs:/path/to/result.txt
。默认导出格式为 CSV。使用my_broker
并设置 hdfs 高可用信息。使用默认的行列分隔符。WITH x1 AS (SELECT k1, k2 FROM tbl1), x2 AS (SELECT k3 FROM tbl2) SELEC k1 FROM x1 UNION SELECT k3 FROM x2 INTO OUTFILE "hdfs:/path/to/result_" PROPERTIES ( "broker.name" = "my_broker", "broker.username"="user", "broker.password"="passwd", "broker.dfs.nameservices" = "my_ha", "broker.dfs.ha.namenodes.my_ha" = "my_namenode1, my_namenode2", "broker.dfs.namenode.rpc-address.my_ha.my_namenode1" = "nn1_host:rpc_port", "broker.dfs.namenode.rpc-address.my_ha.my_namenode2" = "nn2_host:rpc_port", "broker.dfs.client.failover.proxy.provider" = "org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider" );
最终生成文件如如果不大于 1GB,则为:
result_0.csv
。如果大于 1GB,则可能为
result_0.csv, result_1.csv, ...
。示例4
将 UNION 语句的查询结果导出到文件
bos://bucket/result.txt
。指定导出格式为 PARQUET。使用my_broker
并设置 hdfs 高可用信息。PARQUET 格式无需指定列分割符。 导出完成后,生成一个标识文件。SELECT k1 FROM tbl1 UNION SELECT k2 FROM tbl1 INTO OUTFILE "bos://bucket/result_" FORMAT AS PARQUET PROPERTIES ( "broker.name" = "my_broker", "broker.bos_endpoint" = "http://bj.bcebos.com", "broker.bos_accesskey" = "xxxxxxxxxxxxxxxxxxxxxxxxxx", "broker.bos_secret_accesskey" = "yyyyyyyyyyyyyyyyyyyyyyyyyy", "schema"="required,int32,k1;required,byte_array,k2" );
示例5
将 select 语句的查询结果导出到文件
cos://${bucket_name}/path/result.txt
。指定导出格式为 csv。 导出完成后,生成一个标识文件。select k1,k2,v1 from tbl1 limit 100000 into outfile "s3a://my_bucket/export/my_file_" FORMAT AS CSV PROPERTIES ( "broker.name" = "hdfs_broker", "broker.fs.s3a.access.key" = "xxx", "broker.fs.s3a.secret.key" = "xxxx", "broker.fs.s3a.endpoint" = "https://cos.xxxxxx.myqcloud.com/", "column_separator" = ",", "line_delimiter" = "\n", "max_file_size" = "1024MB", "success_file_name" = "SUCCESS" )
最终生成文件如如果不大于 1GB,则为:
my_file_0.csv
。如果大于 1GB,则可能为
my_file_0.csv, result_1.csv, ...
。在cos上验证
- 不存在的path会自动创建
- access.key/secret.key/endpoint需要和cos的同学确认。尤其是endpoint的值,不需要填写bucket_name。
示例6
使用 s3 协议导出到 bos,并且并发导出开启。
set enable_parallel_outfile = true; select k1 from tb1 limit 1000 into outfile "s3://my_bucket/export/my_file_" format as csv properties ( "AWS_ENDPOINT" = "http://s3.bd.bcebos.com", "AWS_ACCESS_KEY" = "xxxx", "AWS_SECRET_KEY" = "xxx", "AWS_REGION" = "bd" )
最终生成的文件前缀为
my_file_{fragment_instance_id}_
。示例7
使用 s3 协议导出到 bos,并且并发导出 session 变量开启。
set enable_parallel_outfile = true; select k1 from tb1 order by k1 limit 1000 into outfile "s3://my_bucket/export/my_file_" format as csv properties ( "AWS_ENDPOINT" = "http://s3.bd.bcebos.com", "AWS_ACCESS_KEY" = "xxxx", "AWS_SECRET_KEY" = "xxx", "AWS_REGION" = "bd" )
但由于查询语句带了一个顶层的排序节点,所以这个查询即使开启并发导出的 session 变量,也是无法并发导出的。
示例7
使用 hdfs 方式导出,将简单查询结果导出到文件
hdfs:/path/to/result.txt
。指定导出格式为 CSV。使用并设置 kerberos 认证信息。SELECT * FROM tbl INTO OUTFILE "hdfs://path/to/result_" FORMAT AS CSV PROPERTIES ( "hdfs.fs.defaultFS" = "hdfs://namenode:port", "hdfs.hadoop.security.authentication" = "kerberos", "hdfs.kerberos_principal" = "doris@YOUR.COM", "hdfs.kerberos_keytab" = "/home/doris/my.keytab" );
返回结果
导出命令为同步命令。命令返回,即表示操作结束。同时会返回一行结果来展示导出的执行结果。
如果正常导出并返回,则结果如下:
mysql> select * from tbl1 limit 10 into outfile "file:///home/work/path/result_";
+------------+-----------+----------+--------------------------------------------------------------------+
| FileNumber | TotalRows | FileSize | URL |
+------------+-----------+----------+--------------------------------------------------------------------+
| 1 | 2 | 8 | file:///192.168.1.10/home/work/path/result_{fragment_instance_id}_ |
+------------+-----------+----------+--------------------------------------------------------------------+
1 row in set (0.05 sec)
- FileNumber:最终生成的文件个数。
- TotalRows:结果集行数。
- FileSize:导出文件总大小。单位字节。
- URL:如果是导出到本地磁盘,则这里显示具体导出到哪个 Compute Node。
如果进行了并发导出,则会返回多行数据。
+------------+-----------+----------+--------------------------------------------------------------------+
| FileNumber | TotalRows | FileSize | URL |
+------------+-----------+----------+--------------------------------------------------------------------+
| 1 | 3 | 7 | file:///192.168.1.10/home/work/path/result_{fragment_instance_id}_ |
| 1 | 2 | 4 | file:///192.168.1.11/home/work/path/result_{fragment_instance_id}_ |
+------------+-----------+----------+--------------------------------------------------------------------+
2 rows in set (2.218 sec)
如果执行错误,则会返回错误信息,如:
mysql> SELECT * FROM tbl INTO OUTFILE ...
ERROR 1064 (HY000): errCode = 2, detailMessage = Open broker writer failed ...
注意事项
- 如果不开启并发导出,查询结果是由单个 BE 节点,单线程导出的。因此导出时间和导出结果集大小正相关。开启并发导出可以降低导出的时间。
- 导出命令不会检查文件及文件路径是否存在。是否会自动创建路径、或是否会覆盖已存在文件,完全由远端存储系统的语义决定。
- 如果在导出过程中出现错误,可能会有导出文件残留在远端存储系统上。Doris 不会清理这些文件。需要用户手动清理。
- 导出命令的超时时间同查询的超时时间。可以通过
SET query_timeout=xxx
进行设置。 - 对于结果集为空的查询,依然会产生一个大小为0的文件。
- 文件切分会保证一行数据完整的存储在单一文件中。因此文件的大小并不严格等于
max_file_size
。 - 对于部分输出为非可见字符的函数,如 BITMAP、HLL 类型,输出为
\N
,即 NULL。 - 目前部分地理信息函数,如
ST_Point
的输出类型为 VARCHAR,但实际输出值为经过编码的二进制字符。当前这些函数会输出乱码。对于地理函数,请使用ST_AsText
进行输出。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论