MaxCompute支援通過建立Paimon外部表格與儲存於OSS上的Paimon表目錄建立映射關係,並訪問其中的資料。本文介紹如何建立Paimon外部表格以及如何通過MaxCompute訪問Paimon外部表格。
功能介紹
Apache Paimon是一種流批一體的湖儲存格式,具備高吞吐的寫入和低延後查詢能力。Realtime ComputeFlink版、E-MapReduce的常見計算引擎(如Spark、Hive或Trino)都與Paimon有完善的整合。藉助Apache Paimon,可以在儲存服務OSS上快速構建資料湖,並能接入MaxCompute實現資料湖分析。中繼資料過濾功能通過減少讀取處理任務中不需要的OSS目錄檔案,進一步最佳化查詢效能。
適用範圍
Paimon外部表格不支援自動跟隨Paimon檔案schema變更而調整schema。
不支援對Paimon外部表格設定cluster屬性,不支援設定主鍵。
Paimon外部表格暫不支援查詢回溯歷史版本的資料等特性。
不建議直接將資料寫入Paimon外部表格,建議使用unload等方式匯出資料到OSS。
可以使用INSERT INTO或INSERT OVERWRITE語句將資料寫入Paimon外部表格,暫不支援寫入Dynamic Bucket表和Cross Partition表。
不支援對Paimon外部表格執行UPDATE/DELETE操作。
MaxCompute需要與OSS部署在同一地區。
支援資料類型
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外部表格
文法結構
各格式的外部表格文法結構詳情,請參見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寫入文法詳情,請參見寫入文法說明。
查詢分析
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類型資料(不推薦)。
常見問題
讀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外部表格。