通過外表導入至數倉版
云原生數據倉庫 AnalyticDB MySQL 版支持通過外表讀取并導入MaxCompute數據。通過外表導入數據可以最大限度地利用集群資源,實現高性能數據導入。您也可以進一步選擇通過Tunnel方式和Storage API兩種方式訪問并導入MaxCompute數據,相較于Tunnel方式,Storage API方式可以提高數據訪問和處理的效率。本文主要介紹如何通過外表將MaxCompute數據導入AnalyticDB for MySQL數倉版。
前提條件
MaxCompute項目與AnalyticDB for MySQL集群位于同一地域。具體操作,請參見創建集群。
已添加AnalyticDB for MySQL的VPC網段到MaxCompute項目的白名單中。
登錄云原生數據倉庫AnalyticDB MySQL控制臺,在集群信息頁面查詢VPC ID。然后登錄專有網絡控制臺,在專有網絡頁面根據VPC ID查詢網段。設置MaxCompute白名單的操作,請參見管理IP白名單。
使用Storage API方式訪問并導入MaxCompute數據時,還需滿足以下條件:
已提交Storage API功能的試用申請,并獲得試用資格。詳情請參見試用申請。
集群內版本需為3.1.10.2及以上版本。
集群所在地域為華東1(杭州)、華東2(上海)、華南1(深圳)或華北2(北京)。
功能介紹
AnalyticDB for MySQL集群默認使用Tunnel方式訪問MaxCompute數據,3.1.10.2及以上內核版本集群支持使用Storage API方式訪問MaxCompute數據。相較于Tunnel方式,Storage API方式可以縮短生成查詢計劃的耗時和將MaxCompute外表數據導入AnalyticDB for MySQL內表的耗時,提升OLAP查詢的查詢性能和數據導入性能。
Storage API方式與Tunnel方式的區別如下:
訪問方式 | 集群版本 | 地域 | 費用 | 數據訪問效率 |
Tunnel方式 | 無限制 | 無限制 | 免費 | 使用公共數據傳輸服務資源組,該資源會被該地域所有項目共享使用,數據訪問和導入速度慢。 |
Storage API方式 | 3.1.10.2及以上版本 |
| 需購買獨享數據傳輸服務資源組,會產生費用。獨享數據傳輸服務資源組的計費規則請參見獨享數據傳輸服務資源組定價。 | 使用獨享數據傳輸服務資源組,為項目配置后,該資源僅供當前項目使用,減少數據訪問和導入時間,提供更高的數據傳輸速度。 |
示例數據
本文示例中的MaxCompute項目為odps_project1
,示例表odps_nopart_import_test
。示例如下:
CREATE TABLE IF NOT EXISTS odps_nopart_import_test (
id int,
name string,
age int)
partitioned by (dt string);
在odps_nopart_import_test
表中添加分區,示例如下:
ALTER TABLE odps_nopart_import_test
ADD
PARTITION (dt='202207');
向分區中添加數據,示例如下:
INSERT INTO odps_project1.odps_nopart_import_test
PARTITION (dt='202207')
VALUES (1,'james',10),(2,'bond',20),(3,'jack',30),(4,'lucy',40);
Tunnel方式訪問MaxCompute
連接目標AnalyticDB for MySQL集群。詳細操作步驟,請參見連接集群。
創建目標數據庫。
CREATE database test_adb;
創建MaxCompute外表。本文以
odps_nopart_import_test_external_table
為例。CREATE TABLE IF NOT EXISTS odps_nopart_import_test_external_table ( id int, name string, age int, dt string ) ENGINE='ODPS' TABLE_PROPERTIES='{ "endpoint":"http://service.cn.maxcompute.aliyun-inc.com/api", "accessid":"L*******FsE", "accesskey":"CcwF********iWjv", "partition_column":"dt", "project_name":"odps_project1", "table_name":"odps_nopart_import_test" }';
參數
說明
ENGINE=’ODPS’
外表的存儲引擎。讀寫MaxCompute數據時,取值為ODPS。
endpoint
MaxCompute的EndPoint(域名節點)。
說明目前僅支持AnalyticDB for MySQL通過MaxCompute的VPC網絡Endpoint訪問MaxCompute。
查詢各地域VPC網絡的Endpoint,請參見各地域Endpoint對照表(阿里云VPC網絡連接方式)。
accessid
阿里云賬號或者具備MaxCompute訪問權限的RAM用戶的AccessKey ID。
如何獲取AccessKey ID和AccessKey Secret,請參見賬號與權限。
accesskey
阿里云賬號或者具備MaxCompute訪問權限的RAM用戶的AccessKey Secret。
如何獲取AccessKey ID和AccessKey Secret,請參見賬號與權限。
partition_column
本文使用的示例是創建分區表的示例,所以需要配置
partition_column
。如果MaxCompute的表是非分區表,那么AnalyticDB for MySQL中也需要創建非分區表,此時無需配置partition_column
。project_name
MaxCompute中的工作空間名稱。
table_name
MaxCompute中的數據源表名。
在
test_adb
數據庫中創建表adb_nopart_import_test
,用于存儲從MaxCompute中導入的數據。CREATE TABLE IF NOT EXISTS adb_nopart_import_test ( id int, name string, age int, dt string, PRIMARY KEY(id,dt) ) DISTRIBUTED BY HASH(id) PARTITION BY VALUE('dt') LIFECYCLE 30;
導入數據。
方式一:執行
INSERT INTO
導入數據,當主鍵重復時會自動忽略當前寫入數據,不做更新,作用等同于INSERT IGNORE INTO
,詳情請參見INSERT INTO。示例如下:INSERT INTO adb_nopart_import_test SELECT * FROM odps_nopart_import_test_external_table;
通過SELECT查詢寫入表中的數據,示例如下:
SELECT * FROM adb_nopart_import_test;
返回結果如下:
+------+-------+------+---------+ | id | name | age | dt | +------+-------+------+---------+ | 1 | james | 10 | 202207 | | 2 | bond | 20 | 202207 | | 3 | jack | 30 | 202207 | | 4 | lucy | 40 | 202207 | +------+-------+------+---------+
如果需要將特定分區的數據導入
adb_nopart_import_test
,可以執行:INSERT INTO adb_nopart_import_test SELECT * FROM odps_nopart_import_test_external_table WHERE dt = '202207';
方式二:執行
INSERT OVERWRITE
導入數據,會覆蓋表中原有的數據。示例如下:INSERT OVERWRITE adb_nopart_import_test SELECT * FROM odps_nopart_import_test_external_table;
方式三:異步執行
INSERT OVERWRITE
導入數據。通常使用SUBMIT JOB
提交異步任務,由后臺調度,可以在寫入任務前增加Hint加速寫入任務。詳情請參見異步寫入。示例如下:SUBMIT JOB INSERT OVERWRITE adb_nopart_import_test SELECT * FROM odps_nopart_import_test_external_table;
返回結果如下:
+---------------------------------------+ | job_id | +---------------------------------------+ | 2020112122202917203100908203303****** |
關于異步提交任務詳情請參見異步提交導入任務。
Storage API方式訪問MaxCompute
使用Storage API方式訪問MaxCompute數據時,您需確保:
已提交Storage API功能的試用申請,并獲得試用資格。詳情請參見試用申請。
集群內版本需為3.1.10.2及以上版本。
集群所在地域為華東1(杭州)、華東2(上海)、華南1(深圳)或華北2(北京)。
費用說明
使用Storage API方式訪問MaxCompute外表數據需購買獨享數據傳輸服務資源組,會產生費用。獨享數據傳輸服務資源組的計費規則請參見獨享數據傳輸服務資源組定價。
購買并配置獨享數據傳輸服務資源組
登錄MaxCompute控制臺購買獨享數據傳輸服務資源組。具體操作,請參見購買獨享數據服務資源組。
在項目管理頁面,選擇目標MaxCompute項目并單擊操作列的管理。
單擊基礎屬性區域的編輯,在數據傳輸服務下拉列表中選擇您購買的獨享資源組。
訪問MaxCompute數據
連接目標AnalyticDB for MySQL集群。詳細操作步驟,請參見連接集群。
創建目標數據庫。
CREATE database adb_demo;
創建MaxCompute外表。本文以person為例。
CREATE TABLE IF NOT EXISTS person ( id int, name string, age int, dt string ) ENGINE='ODPS' TABLE_PROPERTIES='{ "endpoint":"http://service.cn.maxcompute.aliyun-inc.com/api", "accessid":"L*******FsE", "accesskey":"CcwF********iWjv", "partition_column":"dt", "project_name":"odps_project1", "table_name":"odps_nopart_import_test", "odps_quota_name":ot_42854300324284****, "odps_compression_code":ZSTD }';
更多參數,請參見參數說明。
查詢數據。
/*+ storage_api_enabled=true,odps_quota_name=ot_42854300324284****,odps_compression_code=ZSTD*/ SELECT * FROM person;
Hint參數說明:
參數
是否必填
說明
storage_api_enabled
是
是否使用Storage API訪問MaxCompute數據。取值:
true:是。
false(默認值):否,使用Tunnel方式訪問MaxCompute數據。
本示例需配置為true。
說明您也可以使用SET ADB_CONFIG命令配置該參數。詳情請參見Config和Hint配置參數。
odps_quota_name
是
購買獨享數據傳輸服務資源組的名稱。本文示例為ot_42854300324284****。獨享數據傳輸服務資源組的名稱查看方法,請參見查看Quota名稱。
說明您也可以使用SET ADB_CONFIG命令或在TABLE_PROPERTIES中配置該參數。詳情請參見Config和Hint配置參數。
odps_compression_code
否
壓縮MaxCompute數據的方式。默認值為
""
,即不壓縮MaxCompute數據。取值:ZSTD
LZ4_FRAME
說明您也可以使用SET ADB_CONFIG命令或在TABLE_PROPERTIES中配置該參數。詳情請參見Config和Hint配置參數。
返回結果如下:
+------+-------+------+---------+ | id | name | age | dt | +------+-------+------+---------+ | 1 | james | 10 | 202207 | | 2 | bond | 20 | 202207 | | 3 | jack | 30 | 202207 | | 4 | lucy | 40 | 202207 | +------+-------+------+---------+
在
adb_demo
數據庫中創建表test
用于存儲從MaxCompute中導入的數據。CREATE TABLE IF NOT EXISTS test ( id int, name string, age int, dt string, PRIMARY KEY(id,dt) ) DISTRIBUTED BY HASH(id) PARTITION BY VALUE('dt') LIFECYCLE 30;
導入數據。
方式一:執行
INSERT INTO
導入數據,當主鍵重復時會自動忽略當前寫入數據,不做更新,作用等同于INSERT IGNORE INTO
,詳情請參見INSERT INTO。示例如下:/*+ storage_api_enabled=true,odps_quota_name=ot_42854300324284****,odps_compression_code=ZSTD*/ INSERT INTO test SELECT * FROM person;
通過SELECT查詢寫入表中的數據,示例如下:
SELECT * FROM test;
返回結果如下:
+------+-------+------+---------+ | id | name | age | dt | +------+-------+------+---------+ | 1 | james | 10 | 202207 | | 2 | bond | 20 | 202207 | | 3 | jack | 30 | 202207 | | 4 | lucy | 40 | 202207 | +------+-------+------+---------+
如果需要將特定分區的數據導入
test
,可以執行:/*+ storage_api_enabled=true,odps_quota_name=ot_42854300324284****,odps_compression_code=ZSTD*/ INSERT INTO test SELECT * FROM person WHERE dt = '202207';
方式二:執行
INSERT OVERWRITE
導入數據,會覆蓋表中原有的數據。示例如下:/*+ storage_api_enabled=true,odps_quota_name=ot_42854300324284****,odps_compression_code=ZSTD*/ INSERT OVERWRITE test SELECT * FROM person;
方式三:異步執行
INSERT OVERWRITE
導入數據。通常使用SUBMIT JOB
提交異步任務,由后臺調度,可以在寫入任務前增加Hint加速寫入任務。詳情請參見異步寫入。示例如下:/*+ storage_api_enabled=true,odps_quota_name=ot_42854300324284****,odps_compression_code=ZSTD*/ SUBMIT JOB INSERT OVERWRITE test SELECT * FROM person;
返回結果如下:
+---------------------------------------+ | job_id | +---------------------------------------+ | 2020112122202917203100908203303****** |
關于異步提交任務,詳情請參見異步提交導入任務。
Hint參數說明,請參見Hint參數說明。
(可選)查看是否已使用Storage API方式訪問MaxCompute數據。具體操作,請參見資源觀測。
在表訪問熱度(并發數)和訪問來源IP(B/S)指標區域,將使用方式選擇為Storage API讀或Storage API寫,若指標區域有數據,則說明使用了Storage API方式訪問MaxCompute數據;若無,則說明未使用Storage API方式,而默認使用了Tunnel方式訪問MaxCompute數據。