當您需要備份或者遷移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 | 是 | 指向檔案儲存體的路徑以及檔案首碼。 您也可以省略檔案首碼,只指定檔案目錄,如 不指定檔案首碼時,最終匯出的檔案名稱由執行個體名稱_檔案序號以及檔案格式尾碼組成。 指定檔案首碼時,最終匯出的檔案名稱由檔案首碼、執行個體名稱_檔案序號以及檔案格式尾碼組成。
例如,file_path為
其中
|
format_as | 否 | 指定匯出的格式。
|
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) * 64MB。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://。如果使用
http://或https://,則會根據use_path_style參數來決定是否使用Path Style方式訪問S3協議目標。如果使用
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節點,單線程匯出的。因此匯出時間和匯出結果集大小正相關。
如果希望查詢結果集可以並發匯出,可開啟並發匯出以降低匯出的時間。操作如下:
設定會話變數以開啟並發匯出:
set enable_parallel_outfile = true;。驗證查詢是否可以並發匯出。
您開啟並發匯出後,如果想驗證當前查詢是否能進行並發匯出,可以使用EXPLAIN分析查詢匯出語句。文法如下:
EXPLAIN <select_into_outfile>;select_into_outfile為您要執行的
SELECT INTO OUTFILE語句,具體文法,請參見文法。對查詢進行
EXPLAIN後,SelectDB會返回該查詢的規劃,您需分析查詢規劃判斷詢是否可以並發匯出。RESULT FILE SINK在PLAN 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 SINK在PLAN FRAGMENT 0中:查詢不能並發匯出。以下為一個
SELECT INTO OUTFILE任務的查詢規劃,RESULT FILE SINK在PLAN 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 | +-----------------------------------------------------------------------------+
根據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