
# 导出Doris查询结果集
本章节主要介绍如何使用**SELECT INTO OUTFILE**命令，将Doris查询结果集使用指定的文件格式导出到指定的存储系统中。
#### 约束与限制
- 导出命令不会检查文件及文件路径是否存在、是否会自动创建路径、或是否会覆盖已存在文件，由远端存储系统的语义决定。
- 如果在导出过程中出现错误，可能会有导出文件残留在远端存储系统上，Doris不会清理这些文件，需要手动清理。
- 导出命令的超时时间同查询的超时时间，可以通过**SET query_timeout=** *xxx*进行设置。
- 对于结果集为空的查询，依然会产生一个大小为0的文件。
- 文件切分会保证一行数据完整的存储在单一文件中，因此文件的大小并不严格等max_file_size。
- 对于部分输出为非可见字符的函数，如BITMAP、HLL类型，输出为**\\N**，即NULL。
- 目前部分地理信息函数，如ST_Point的输出类型为VARCHAR，但实际输出值为经过编码的二进制字符，当前这些函数会输出乱码。对于地理函数，请使用ST_AsText进行输出。
 
#### 语法介绍
```
<query_stmt>
INTO OUTFILE "file_path"
[format_as]
[properties]
```
其中：
- "query_stmt"表示具体的查询语句。
- "file_path"表示导出的文件的存储路径。
- "format_as"表示指定导出格式，支持CSV、PARQUET、CSV_WITH_NAMES、CSV_WITH_NAMES_AND_TYPES、ORC，默认为CSV。
更多介绍请参见[OUTFILE](https://doris.apache.org/zh-CN/docs/sql-manual/sql-statements/data-modification/load-and-export/OUTFILE)。
#### 查询结果导出示例
- 导出到HDFS 使用Broker方式将简单查询结果导出到文件"hdfs://path/tmp/result.txt"中，并指定导出格式为CSV。
  - 集群已启用Kerberos认证（安全模式）
    ```
    SELECT * FROM example_db.test_export_tbl
    INTO OUTFILE "hdfs://192.168.67.78:25000/tmp/result_"
    FORMAT AS CSV
    PROPERTIES
    (
    "broker.name" = "broker_192_168_67_78",
    "column_separator" = ",",
    "line_delimiter" = "\n",
    "max_file_size" = "100MB",
    "broker.hadoop.security.authentication" = "kerberos",
    "broker.kerberos_principal" = "doris/hadoop.hadoop.com@HADOOP.COM",
    "broker.kerberos_keytab" = "/home/omm/doris_keytab/doris.keytab",
    "broker.dfs.nameservices" = "hacluster",
    "broker.dfs.ha.namenodes.hacluster" = "37,36",
    "broker.dfs.namenode.rpc-address.hacluster.37" = "主NameNode实例IP地址:RPC端口号",
    "broker.dfs.namenode.rpc-address.hacluster.36" = "备NameNode实例IP地址:RPC端口号",
    "broker.dfs.client.failover.proxy.provider.hacluster" = "org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider"
    );
    ```
    
  
  - 集群未启用Kerberos认证（普通模式）
    ```
    SELECT * FROM example_db.test_export_tbl
    INTO OUTFILE "hdfs://192.168.67.78:25000/tmp/result_"
    FORMAT AS CSV
    PROPERTIES
    (
    "broker.name" = "broker_192_168_67_78",
    "column_separator" = ",",
    "line_delimiter" = "\n",
    "max_file_size" = "100MB",
    "broker.username"="hdfs",
    "broker.password"="",
    "broker.dfs.nameservices" = "hacluster",
    "broker.dfs.ha.namenodes.hacluster" = "37,36",
    "broker.dfs.namenode.rpc-address.hacluster.37" = "主NameNode实例IP地址:RPC端口号",
    "broker.dfs.namenode.rpc-address.hacluster.36" = "备NameNode实例IP地址:RPC端口号",
    "broker.dfs.client.failover.proxy.provider.hacluster" = "org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider"
    );
    ```
    
   
- 导出到OBS 将简单查询结果导出到文件"obs://tmp-doris/load_export/outfile/"中，并指定导出格式为CSV：
  ```
  SELECT * FROM example_db.load_hdfs_file_test
  INTO OUTFILE "obs://tmp-doris/load_export/outfile/"
  FORMAT AS CSV
  PROPERTIES
  (
  "broker.name" = "default_broker_group",
  "column_separator" = ",",
  "line_delimiter" = "\n",
  "max_file_size" = "100MB",
  'broker.fs.obs.access.key'='AK',   
  'broker.fs.obs.secret.key'='SK',  
  'broker.fs.obs.endpoint'='obs_endpoint'
  );
  ```
  ![](https://support.huaweicloud.com/cmpntguide-lts-mrs/public_sys-resources/note_3.0-zh-cn.png)
  - *broker_name* ：表示Broker名称，可在MySQL客户端执行**show broker;**命令查看。
  
  - AK/SK：需登录MRS管理控制台，将鼠标移到右上角登录用户名处，在下拉列表中选择"我的凭证"。单击"访问密钥"，单击"新增访问密钥"，输入验证码或密码。单击"确定"，生成并下载访问密钥，在.csv文件中获取AK/SK信息。
  
  - *obs_endpoint*：表示存放导出数据的OBS并行文件系统的Endpoint。可登录OBS管理控制台，在左侧导航栏选择"并行文件系统"，单击对应的并行文件系统名称，单击"概览"，查看并记录"Endpoint"信息。
  
  
  
  - column_separator：用于设置导出数据的列分隔符，默认为**\\t**。支持不可见字符，例如：'\\x07'。
    
- 导出到本地文件 导出到本地文件时需要先在"fe.conf"中配置**enable_outfile_to_local=true。**
  ```
  select * from tbl1 limit 10
  INTO OUTFILE "file:///home/work/path/result_";
  ```
  
 
