MaxCompute支援通過建立Paimon外部表格與儲存於OSS上的Paimon表目錄建立映射關係,並訪問其中的資料。本文介紹如何建立Paimon外部表格以及如何通過MaxCompute訪問Paimon外部表格。
功能介紹
Apache Paimon是一種流批一體的湖儲存格式,具備高吞吐的寫入和低延後查詢能力。Realtime ComputeFlink版、E-MapReduce的常見計算引擎(如Spark、Hive或Trino)都與Paimon有完善的整合。藉助Apache Paimon,可以在儲存服務OSS上快速構建資料湖,並能接入MaxCompute實現資料湖分析。中繼資料過濾功能通過減少讀取處理任務中不需要的OSS目錄檔案,進一步最佳化查詢效能。
適用範圍
-
Schema限制
Paimon外部表格不支援自動跟隨Paimon檔案Schema變更而調整Schema。
-
表屬性限制
-
不支援對Paimon外部表格設定cluster屬性;
-
不支援設定主鍵;
-
Paimon外部表格暫不支援Paimon表屬性透傳。
-
-
資料寫入、修改及查詢
-
可以使用INSERT INTO或INSERT OVERWRITE語句將資料寫入Paimon外部表格。
-
暫不支援寫入Dynamic Bucket表和Cross Partition表。
-
不支援對Paimon外部表格執行UPDATE/DELETE操作。
-
Paimon外部表格暫不支援查詢回溯歷史版本的資料等特性。
-
不建議直接將資料寫入Paimon外部表格,建議使用UNLOAD等方式匯出資料到OSS。
-
-
MaxCompute需要與OSS部署在同一地區。
建立Paimon外部表格
文法結構
各格式的外部表格文法結構詳情,請參見OSS外部表格。
CREATE EXTERNAL TABLE [if NOT EXISTS] <mc_oss_extable_name>
(
<col_name> <data_type>,
...
)
[COMMENT <table_comment>]
[PARTITIONED BY (<col_name> <data_type>, ...)]
STORED BY 'org.apache.paimon.hive.PaimonStorageHandler'
WITH serdeproperties (
'odps.properties.rolearn'='acs:ram::<uid>:role/aliyunodpsdefaultrole'
)
LOCATION '<oss_location>';
公用參數
公用參數說明請參見基礎文法參數說明。
寫入資料
MaxCompute寫入文法詳情,請參見寫入文法說明。
查詢分析
-
Paimon表資料分區(Split)邏輯與MaxCompute原生表不同。Paimon格式擁有獨立的內部檔案組織和分區機制,不完全參照MaxCompute參數。
-
SELECT文法詳情,請參見查詢文法說明。
-
最佳化查詢計劃詳情,請參見查詢最佳化。
-
BadRowSkipping詳情,請參見BadRowSkipping。
使用樣本
步驟一:前置準備
-
已準備好OSS儲存空間(Bucket)、OSS目錄。具體操作請參見建立儲存空間、管理目錄。
由於MaxCompute只在部分地區部署,跨地區的資料連通性可能存在問題,因此建議Bucket與MaxCompute專案所在地區保持一致。
-
授權
-
具備訪問OSS的許可權。阿里雲帳號(主帳號)、RAM使用者或RAMRole身份可以訪問OSS外部表格,授權資訊請參見OSS的STS模式授權。
-
已具備在MaxCompute專案中建立表(CreateTable)的許可權。表操作的許可權資訊請參見MaxCompute許可權。
-
步驟二:在Flink中準備資料
建立Paimon Catalog和Paimon表,並在表中插入資料,樣本如下。
如果在OSS中已有Paimon表資料,可忽略此步驟。
-
建立Paimon Filesystem Catalog
-
登入Flink控制台,在左上方選擇地區。
-
單擊目標工作空間名稱,然後在左側導覽列,選擇資料管理。
-
在右側Catalog列表 介面,單擊建立Catalog 。在彈出的建立 Catalog 對話方塊裡,選擇Apache Paimon,單擊下一步 並配置如下參數:
參數
是否必填
說明
metastore
必填
中繼資料存放區類型。本樣本中選擇
filesystem。catalog name
必填
自訂catalog名稱,例如
paimon-catalog。warehouse
必填
OSS服務中所指定的數倉目錄。本樣本中
oss://paimon-fs/paimon-test/。fs.oss.endpoint
必填
OSS服務的endpoint,例如杭州地區為
oss-cn-hangzhou-internal.aliyuncs.com。fs.oss.accessKeyId
必填
訪問OSS服務所需的Access Key ID。
fs.oss.accessKeySecret
必填
訪問OSS服務所需的Access Key Secret。
-
-
建立Paimon表
-
登入Flink控制台,在左上方選擇地區。
-
單擊目標工作空間名稱,然後在左側導覽列,選擇。
-
在查詢指令碼頁簽,單擊
,建立查詢指令碼。輸入如下命令後,單擊運行。
CREATE TABLE `paimon_catalog`.`default`.test_tbl ( id BIGINT, data STRING, dt STRING, PRIMARY KEY (dt, id) NOT ENFORCED ) PARTITIONED BY (dt); INSERT INTO `paimon-catalog`.`default`.test_tbl VALUES (1,'CCC','2024-07-18'), (2,'DDD','2024-07-18');
-
-
若SQL作業有限流作業(例如執行
INSERT INTO ... VALUES ...語句),需要執行以下操作:-
單擊目標工作空間名稱,然後在左側導覽列,選擇。
-
在作業營運頁面,單擊目標作業名稱,進入作業部署詳情頁面。
-
在運行參數配置地區,單擊編輯,在其他配置中設定
execution.checkpointing.checkpoints-after-tasks-finish.enabled: true代碼並儲存。配置作業的運行參數詳情,請參見配置作業部署資訊。
-
步驟三:通過MaxCompute建立Paimon外表
在MaxCompute中執行以下SQL代碼,建立MaxCompute Paimon外部表格。
CREATE EXTERNAL TABLE oss_extable_paimon_pt
(
id BIGINT,
data STRING
)
PARTITIONED BY (dt STRING )
STORED BY 'org.apache.paimon.hive.PaimonStorageHandler'
WITH serdeproperties (
'odps.properties.rolearn'='acs:ram::<uid>:role/aliyunodpsdefaultrole'
)
LOCATION 'oss://oss-cn-<your region>-internal.aliyuncs.com/<table_path>'
;
上述代碼中table_path為Flink中建立的Paimon表路徑,例如paimon-fs/paimon-test/default.db/test_tbl。擷取方法如下:
-
登入Flink控制台,在左上方選擇地區。
-
單擊目標工作空間名稱,然後在左側導覽列,選擇資料管理。
-
在中繼資料頁面單擊目標Catalog下的default,並在default頁面中單擊目標表操作列的查看。
-
在表結構詳情頁簽的表屬性地區擷取path參數值,table_path中僅填寫
oss://之後的路徑。
步驟四:引入分區資料
當建立的OSS外部表格為分區表時,需要額外執行引入分區資料的操作,詳情請參見OSS外部表格。
MSCK REPAIR TABLE oss_extable_paimon_pt ADD PARTITIONS;
步驟五:通過MaxCompute讀取Paimon外部表格
在MaxCompute中執行以下命令,查詢MaxCompute Paimon外部表格oss_extable_paimon_pt。
SET odps.sql.common.table.planner.ext.hive.bridge = true;
SET odps.sql.hive.compatible = true;
SELECT * FROM oss_extable_paimon_pt WHERE dt='2024-07-18';
返回結果如下:
+------------+------------+------------+
| id | data | dt |
+------------+------------+------------+
| 1 | CCC | 2024-07-18 |
| 2 | DDD | 2024-07-18 |
+------------+------------+------------+
當Paimon檔案中的Schema與外表Schema不一致時:
-
列數不一致:如果Paimon檔案中的列數小於外表DDL的列數,則讀取Paimon資料時,系統會將缺少的列值補充為NULL。反之(大於時),會丟棄超出的列資料。
-
列類型不一致:MaxCompute不支援使用INT類型接收Paimon檔案中的STRING類型資料,支援使用STRING類型接收INT類型資料(不推薦)。
支援資料類型
MaxCompute資料類型請參見1.0資料類型版本和2.0資料類型版本。
|
開源Paimon資料類型 |
MaxCompute 2.0資料類型 |
是否支援讀寫 |
說明 |
|
TINYINT |
TINYINT |
|
8位有符號整型。 |
|
SMALLINT |
SMALLINT |
|
16位有符號整型。 |
|
INT |
INT |
|
32位有符號整型。 |
|
BIGINT |
BIGINT |
|
64位有符號整型。 |
|
BINARY(MAX_LENGTH) |
BINARY |
|
位元據類型,目前長度限制為8 MB。 |
|
FLOAT |
FLOAT |
|
32位二進位浮點型。 |
|
DOUBLE |
DOUBLE |
|
64位二進位浮點型。 |
|
DECIMAL(precision,scale) |
DECIMAL(precision,scale) |
|
10進位精確數字類型,預設為
|
|
VARCHAR(n) |
VARCHAR(n) |
|
變長字元類型。n為長度,[1,65535]。 |
|
CHAR(n) |
CHAR(n) |
|
固定長度字元類型。n為長度,[1,255]。 |
|
VARCHAR(MAX_LENGTH) |
STRING |
|
字串類型目前長度限制為8MB。 |
|
DATE |
DATE |
|
日期類型格式為 |
|
TIME、TIME(p) |
不支援 |
|
Paimon資料類型TIME,不帶時區的時間類型,由時分秒組成,精度可到納秒。 TIME(p)表示小數位的精度,0-9之間,預設為0。 MaxCompute側沒有映射的類型。 |
|
TIMESTAMP、TIMESTAMP(p) |
TIMESTAMP_NTZ |
|
無時區時間戳記類型,精確到納秒。 讀表需開啟Native開關 |
|
TIMESTAMP WITH LOCAL TIME_ZONE(9) |
TIMESTAMP |
|
|
|
TIMESTAMP WITH LOCAL TIME_ZONE(9) |
DATETIME |
|
時間戳記類型,精確到納秒 格式為 |
|
BOOLEAN |
BOOLEAN |
|
BOOLEAN類型。 |
|
ARRAY |
ARRAY |
|
複雜類型。 |
|
MAP |
MAP |
|
複雜類型。 |
|
ROW |
STRUCT |
|
複雜類型。 |
|
MULTISET<t> |
不支援 |
|
MaxCompute側沒有映射的類型。 |
|
VARBINARY、VARBINARY(n)、BYTES |
BINARY |
|
可變長度二進位字串的資料類型。 |
常見問題
讀Paimon外部表格報錯kSIGABRT
-
報錯資訊:
ODPS-0123144: Fuxi job failed - kSIGABRT(errCode:6) at Odps/*****_SQL_0_1_0_job_0/M1@f01b17437.cloud.eo166#3. Detail error msg: CRASH_CORE, maybe caused by jvm crash, please check your java udf/udaf/udtf. | fatalInstance: Odps/*****_SQL_0_1_0_job_0/M1#0_0 -
錯誤原因:
JNI模式下讀取TIMESTAMP_NTZ類型會產生此報錯。
-
解決方案:
讀表前加上開啟Native開關
SET odps.sql.common.table.jni.disable.native=true;。
相關文檔
可以在Flink中以自訂Catalog的方式建立MaxCompute Paimon外部表格,並在寫入資料後,通過MaxCompute查詢並消費Paimon資料,詳情請參見基於Flink建立MaxCompute Paimon外部表格。