全部產品
Search
文件中心

ApsaraDB for SelectDB:SELECT INTO OUTFILE

更新時間:Jun 17, 2025

當您需要備份或者遷移ApsaraDB for SelectDB中的資料時,可以使用SELECT INTO OUTFILE命令,可以將查詢結果匯出為檔案,並支援通過 S3 或 HDFS 協議將資料匯出至遠程儲存(如 OSS、HDFS 等)。

功能介紹

SELECT INTO OUTFILE可用於備份或者遷移SelectDB中的資料,該命令具有以下特點。

  • 屬於同步命令。

    • 該命令執行完畢後,會立即返回一行結果作為匯出執行狀態。

    • 由於同步機制下任務狀態僅在完成後返回,若串連中斷,系統無法擷取中間狀態,因此無法判斷匯出是否完整完成”。

      為避免任務中斷後無法判斷匯出是否完整,建議您在建立匯出任務時,在Properties中配置"success_file_name" = "SUCCESS",任務成功後在輸出目錄會產生指定標識檔案。您可通過驗證該檔案是否存在,確認匯出完整性。

  • 本質是執行了一個SQL查詢。

    該命令本質為執行SQL查詢,預設採用單線程輸出結果。

  • 匯出耗時:匯出總耗時=查詢執行時間+結果集寫出耗時

    若處理大規模查詢,需通過會話變數query_timeout調大逾時閾值。如何設定查詢會話變數,請參見查詢變數

  • 匯出結果為檔案。

    該命令用於將查詢結果匯出為檔案。目前支援通過S3或HDFS協議匯出到遠端儲存,如OSS、HDFS等。

  • 匯出時不檢查檔案及檔案路徑是否存在。

    該命令不檢查檔案及檔案路徑是否存在,也不會自動建立目錄或覆蓋現有檔案,具體行為完全取決於遠端儲存系統(如S3/HDFS)的規則。

    SelectDB不會對匯出的檔案進行任何管理,所有匯出檔案(包括成功產物及失敗殘留檔案)均需您在遠端儲存側自行管理及清理。

使用限制

目前僅支援通過S3或HDFS協議匯出資料。

注意事項

  • 資料類型不同,支援匯出至的檔案類型會有所不同。

    • 基礎資料型別 (Elementary Data Type):支援匯出至CSV、PARQUET、CSV_WITH_NAMES、CSV_WITH_NAMES_AND_TYPES和ORC格式的檔案中。

    • 複雜資料類型:

      • 僅支援將複雜資料類型(ARRAY、MAP、STRUCT)匯出到CSV、CSV_WITH_NAMES、CSV_WITH_NAMES_AND_TYPES和ORC格式的檔案中。

      • 不支援匯出嵌套的複雜資料類型。

  • 結果檔案注意事項:

    • 對於結果集為空白的查詢,依然會產生一個檔案。

    • 檔案切分會保證一行資料完整的儲存在單一檔案中,因此檔案的大小並不嚴格等於max_file_size

  • 結果檔案內容輸出注意事項:

    • 對於部分輸出為非可見字元的函數,如BITMAP、HLL類型,輸出為\N,即NULL。

    • 目前部分地理位置函數的實際輸出值內容為經過編碼的二進位字元,請使用ST_AsText進行輸出。這類地理位置函數有:

      ST_CIRCLE、ST_POINT、ST_POLYGON、ST_GEOMETRYFROMTEXT、ST_LINEFROMTEXT、ST_GEOMETRYFROMWKB

文法

<query_stmt>
INTO OUTFILE "<file_path>"
[format_as]
[properties]

參數說明

參數名稱

是否必填

參數說明

query_stmt

使用SELECT語句,查詢需要匯出的資料集。

file_path

指向檔案儲存體的路徑以及檔案首碼。

您也可以省略檔案首碼,只指定檔案目錄,如"hdfs://path/to/"

不指定檔案首碼時,最終匯出的檔案名稱由執行個體名稱_檔案序號以及檔案格式尾碼組成。

指定檔案首碼時,最終匯出的檔案名稱由檔案首碼、執行個體名稱_檔案序號以及檔案格式尾碼組成。

  • 檔案序號由0開始,數量為檔案被分割的數量。

    當檔案是個單檔案時,檔案名稱中沒有檔案序號。

  • 檔案尾碼預設為.csv,具體取決於下述format_as指定的匯出格式。

例如,file_path為

  • "s3://bucket_name/to/my_file_"

  • "hdfs://path/to/my_file_"

其中

  • 檔案首碼為my_file_

  • 如果format_as指定為CSV,則檔案尾碼為csv。

  • 檔案是否為單檔案。

    • 是單檔案,則沒有檔案序號。最終檔案名稱則為:my_file_執行個體名稱_0.csv

    • 不是單檔案:

      • 檔案序號由0開始,依次加1。

      • 數量為檔案被分割的數量。

      最終檔案名稱則為

      my_file_abcdefg_0.csv
      my_file_abcdefg_1.csv
      my_file_abcdegf_2.csv
      ...

format_as

指定匯出的格式。

  • 支援CSV、PARQUET、CSV_WITH_NAMES、CSV_WITH_NAMES_AND_TYPES和ORC。

  • 不設定此參數,預設匯出為CSV。

properties

指定匯出檔案相關屬性,以及HDFS、S3的相關屬性。詳情請參見Properties文法

說明

目前僅支援通過S3或HDFS協議進行匯出。

Properties文法

Properties的文法如下,支援檔案、HDFS、S3相關屬性配置。

[PROPERTIES ("key"="value", ...)]
  • 檔案相關屬性

    參數名稱

    是否必填

    參數說明

    column_separator

    列分割符,只用於CSV相關格式。

    line_delimiter

    行分割符,只用於CSV相關格式。

    max_file_size

    單個檔案大小限制。如果結果超過這個值,將切割成多個檔案。

    • 取值範圍:[5 MB, 2 GB]

    • 預設值:1 GB

    當指定匯出為ORC檔案格式(即format_as參數為ORC)時,實際切分檔案的大小是ceil (max_file_size/64) * 64 MB。

    delete_existing_files

    是否刪除file_path指定目錄下的所有檔案。

    • false(預設值):不刪除定目錄下的所有檔案,直接匯出檔案。

    • true:先刪除file_path指定目錄下的所有檔案,然後匯出資料到該目錄下。例如:

      • "file_path" = "/user/tmp",則會刪除"/user/"下所有檔案及目錄。

      • "file_path" = "/user/tmp/",則會刪除"/user/tmp/"下所有檔案及目錄。

    警告
    • 指定delete_existing_files = true是一個危險的操作,建議只在測試環境中使用。

    • 若要使用delete_existing_files參數,您可以向阿里雲客服提工單,SelectDB技術團隊在fe.conf設定檔中添加配置enable_delete_existing_files = true,並重啟FE後,delete_existing_files才會生效。

    file_suffix

    指定匯出檔案的尾碼,若不指定該參數,將使用檔案格式的預設尾碼。

  • HDFS相關屬性

    參數名稱

    是否必選

    參數說明

    fs.defaultFS

    NameNode地址和連接埠。

    hadoop.username

    HDFS使用者名稱。

    dfs.nameservices

    Name Service名稱,與hdfs-site.xml保持一致。

    dfs.ha.namenodes.[nameservice ID]

    NameNode的ID列表,與hdfs-site.xml保持一致。

    dfs.namenode.rpc-address.[nameservice ID].[name node ID]

    NameNode的RPC地址,數量與NameNode數量相同,與hdfs-site.xml保持一致。

    dfs.client.failover.proxy.provider.[nameservice ID]

    HDFS用戶端串連活躍NameNode的Java類,通常是org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider

    對於開啟Kerberos認證的Hadoop叢集,還需要額外設定如下PROPERTIES屬性:

    參數名稱

    是否必選

    參數說明

    dfs.namenode.kerberos.principal

    HDFS NameNode服務的Principal名稱。

    hadoop.security.authentication

    指定認證方式。指定為kerberos以啟用Kerberos認證。

    hadoop.kerberos.principal

    指定Kerberos的Principal。

    hadoop.kerberos.keytab

    指定Kerberos的Keytab檔案路徑。

  • S3相關屬性

    支援S3協議的儲存系統,包括但不限於S3,OSS等,都可參考該參數列表進行配置。

    參數名稱

    是否必選

    參數說明

    s3.endpoint

    使用S3協議目標的endpoint。

    s3.access_key

    使用S3協議目標的使用者身份密鑰。

    s3.secret_key

    使用S3協議目標的使用者加密認證字串。

    s3.region

    使用S3協議目標的Region。

    s3.session_token

    使用S3協議目標的使用者臨時會話token。若啟用臨時會話驗證。

    use_path_style

    預設為false

    S3 SDK預設使用Virtual-hosted Style方式。

    但某些Object Storage Service系統可能沒開啟或沒支援Virtual-hosted Style方式的訪問,您可以通過添加use_path_style參數來強制使用Path Style方式。

    說明

    URI目前支援三種方案(schema):http://https://s3://

    1. 如果使用http://https://,則會根據use_path_style參數來決定是否使用Path Style方式訪問S3協議目標。

    2. 如果使用s3://,則會使用Virtual-hosted Style方式訪問S3協議目標。

響應結果說明

匯出命令為同步命令。命令返回即表示操作結束,並且會返回一行結果,來展示匯出的執行結果。

  • 如果正常匯出並返回,則結果如下:

    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)
  • 如果執行錯誤,則會返回錯誤資訊,例如:

    SELECT * FROM tbl INTO OUTFILE ...
    ERROR 1064 (HY000): errCode = 2, detailMessage = ...

並發匯出

預設情況下,查詢結果集的匯出是非並發的,也就是由單個BE節點,單線程匯出的。因此匯出時間和匯出結果集大小正相關。

如果希望查詢結果集可以並發匯出,可開啟並發匯出以降低匯出的時間。操作如下:

  1. 設定會話變數以開啟並發匯出:set enable_parallel_outfile = true;

  2. 驗證查詢是否可以並發匯出。

    您開啟並發匯出後,如果想驗證當前查詢是否能進行並發匯出,可以使用EXPLAIN分析查詢匯出語句。文法如下:

    EXPLAIN <select_into_outfile>;

    select_into_outfile為您要執行的SELECT INTO OUTFILE語句,具體文法,請參見文法

    對查詢進行EXPLAIN後,SelectDB會返回該查詢的規劃,您需分析查詢規劃判斷詢是否可以並發匯出。

    • RESULT FILE SINKPLAN FRAGMENT 1中:查詢可並發匯出。

      滿足並發的查詢,您可通be_instance_num * parallel_fragment_exec_instance_num計算並發匯出查詢結果集的並發度。

      • be_instance_num是BE叢集的節點數。

        • 計算資源為32核及以下的叢集為單節點。

        • 計算資源為32核以上的叢集,每32核為一個節點。

      • parallel_fragment_exec_instance_num是並發參數。

        您可通過以下語句查看此參數。

        SHOW variables LIKE  '% parallel_fragment_exec_instance_num%'; 

        通過以下語句設定此參數。

        SET  parallel_fragment_exec_instance_num = <parallel_fragment_exec_instance_num>;  
    • RESULT FILE SINKPLAN FRAGMENT 0中:查詢不能並發匯出。

      以下為一個SELECT INTO OUTFILE任務的查詢規劃,RESULT FILE SINKPLAN FRAGMENT 0中,該SELECT INTO OUTFILE不能並發匯出。

      並發匯出的規劃樣本:
      +-----------------------------------------------------------------------------+
      | 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                                                    |
      +-----------------------------------------------------------------------------+
  3. 根據SELECT INTO OUTFILE的文法建立匯出任務,匯出資料。

使用樣本

使用HDFS方式匯出

使用HDFS方式匯出。將簡單查詢結果匯出到檔案中,其中指定匯出格式為CSV。樣本如下。

說明

使用HDFS方式匯出資料時,Hadoop叢集是否已開啟高可用,導致SELECT INTO OUTFILE的PROPERTIES會有所不同。

Hadoop叢集未開啟高可用

-- fileSystem_port預設值為9000
SELECT * FROM tbl
INTO OUTFILE "hdfs://${host}:${fileSystem_port}/path/to/result_"
FORMAT AS CSV
PROPERTIES
(
    "fs.defaultFS" = "hdfs://ip:port",
    "hadoop.username" = "work"
);

Hadoop叢集已開啟高可用

--HA fileSystem_port預設值為8020
SELECT * FROM tbl
INTO OUTFILE "hdfs:///path/to/result_"
FORMAT AS CSV
PROPERTIES
(
'fs.defaultFS'='hdfs://hacluster/',
'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'
);

產生的檔案如果大小不超過1 GB,則為:result_0.csv。 如果大於1 GB,則可能為result_0.csv, result_1.csv, ...

使用S3協議匯出到檔案

將UNION語句的查詢結果匯出到檔案中。其中,儲存系統指定為位於可用性區域cn-hangzhou的OSS中的桶oss-bucket。指定匯出格式為PARQUET(PARQUET格式無需指定列分割符),並且匯出完成後,產生一個標識檔案,樣本如下。

SELECT k1 FROM tbl1 UNION SELECT k2 FROM tbl1
INTO OUTFILE "s3://oss-bucket/result_"
FORMAT AS PARQUET
PROPERTIES
(
    "s3.endpoint" = "oss-cn-hangzhou-internal.aliyuncs.com",
    "s3.access_key" = "****",
    "s3.secret_key" = "****",
    "s3.region" = "cn-hangzhou"
);
重要

使用S3協議匯出資料時,對於不同雲廠商提供的Object Storage Service系統,URI都應該使用三種schema(http://,https://和 s3://)之一作為路徑開頭標誌。否則將提示ERROR 1105 (HY000): errCode = 2, detailMessage = Unknown properties: [s3.region, s3.endpoint, s3.secret_key, s3.access_key]

使用S3協議並發匯出到OSS

使用S3協議並發匯出資料至OSS,樣本如下。

SET enable_parallel_outfile = true;

SELECT k1 FROM tb1 LIMIT 1000
INTO outfile "s3://my_bucket/export/my_file_"
format AS csv
properties
(
    "s3.endpoint" = "oss-cn-hangzhou-internal.aliyuncs.com",
    "s3.access_key" = "****",
    "s3.secret_key" = "****",
    "s3.region" = "cn-hangzhou"
)

同樣的資料結果集,但由於查詢中包含對最終結果的排序處理(order by k1),所以這個查詢即使開啟並發匯出的會話變數,也是無法並發匯出的,樣本如下。

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
(
    "s3.endpoint" = "oss-cn-hangzhou-internal.aliyuncs.com",
    "s3.access_key" = "****",
    "s3.secret_key" = "****",
    "s3.region" = "cn-hangzhou"
)

資料類型映射

Parquet 和 ORC 檔案格式都有各自的資料類型。SelectDB的匯出功能能夠自動將SelectDB的資料類型匯出為Parquet/ORC檔案格式所對應的資料類型。

  • SelectDB匯出到ORC檔案格式的資料類型映射:

    SelectDB Type

    Orc Type

    boolean

    boolean

    tinyint

    tinyint

    smallint

    smallint

    int

    int

    bigint

    bigint

    largeInt

    string

    date

    string

    datev2

    string

    datetime

    string

    datetimev2

    timestamp

    float

    float

    double

    double

    char / varchar / string

    string

    decimal

    decimal

    struct

    struct

    map

    map

    array

    array

  • 在將資料從SelectDB匯出到Parquet檔案格式時,會先將SelectDB記憶體中的資料轉換為Arrow記憶體資料格式,然後由Arrow寫出到Parquet檔案格式。SelectDB資料類型到Arrow資料類的映射關係為:

    SelectDB Type

    Arrow Type

    boolean

    boolean

    tinyint

    int8

    smallint

    int16

    int

    int32

    bigint

    int64

    largeInt

    utf8

    date

    utf8

    datev2

    utf8

    datetime

    utf8

    datetimev2

    utf8

    float

    float32

    double

    float64

    char / varchar / string

    utf8

    decimal

    decimal128

    struct

    struct

    map

    map

    array

    list