Table Store(Table Store)是構建在阿里雲飛天分布式系統之上的NoSQL資料存放區服務,提供海量結構化資料的儲存和即時訪問。您可以通過TableStore文檔對其進行瞭解。
MaxCompute與TableStore是兩個獨立的大資料計算和儲存服務,所以兩者之間的網路必須保證連通性。MaxCompute公用雲端服務訪問TableStore儲存時,推薦您使用TableStore私網地址,也就是host名以ots-internal.aliyuncs.com作為結尾的地址,例如tablestore://odps-ots-dev.cn-shanghai.ots-internal.aliyuncs.com。
前文為您介紹了如何訪問OSS非結構化資料,本文將進一步為您介紹如何將來自TableStore(OTS)的資料納入MaxCompute上的計算生態,實現多種資料來源之間的無縫串連。
MaxCompute Type | TableStore Type |
---|---|
STRING | STRING |
BIGINT | INTEGER |
DOUBLE | DOUBLE |
BOOLEAN | BOOLEAN |
BINARY | BINARY |
STS模式授權
MaxCompute計算服務訪問Table Store資料需要有一個安全的授權通道。在此問題上,MaxCompute結合了阿里雲的存取控制服務(RAM)和令牌服務(STS)來實現對資料的安全訪問。
- 當MaxCompute和Table Store的Owner是同一個帳號時,登入阿里雲帳號後,單擊此處完成一鍵授權。
- 自訂授權
- 首先在RAM控制台中授予MaxCompute訪問Table Store的許可權。
登入 RAM控制台(若MaxCompute和Table Store不是同一個帳號,此處需由Table Store帳號登入進行授權),建立角色,角色名稱叫AliyunODPSDefaultRole或AliyunODPSRoleForOtherUser。
- 修改策略內容設定,如下所示:
--當MaxCompute和Table Store的Owner是同一個帳號 { "Statement": [ { "Action": "sts:AssumeRole", "Effect": "Allow", "Principal": { "Service": [ "odps.aliyuncs.com" ] } } ], "Version": "1" } --當MaxCompute和Table Store的Owner不是同一個帳號 { "Statement": [ { "Action": "sts:AssumeRole", "Effect": "Allow", "Principal": { "Service": [ "MaxCompute的Owner雲帳號的UID@odps.aliyuncs.com" ] } } ], "Version": "1" }
说明 您可單擊右上方的登入帳號,進入帳號管理頁面查看雲帳號的UID。
- 編輯該角色的授權策略AliyunODPSRolePolicy,如下所示:
{ "Version": "1", "Statement": [ { "Action": [ "ots:ListTable", "ots:DescribeTable", "ots:GetRow", "ots:PutRow", "ots:UpdateRow", "ots:DeleteRow", "ots:GetRange", "ots:BatchGetRow", "ots:BatchWriteRow", "ots:ComputeSplitPointsBySize" ], "Resource": "*", "Effect": "Allow" } ] } --還可自訂其他許可權
- 將許可權AliyunODPSRolePolicy授權給該角色。
- 首先在RAM控制台中授予MaxCompute訪問Table Store的許可權。
建立外部表格
MaxCompute通過建立外部表格,把對TableStore表資料的描述引入到MaxCompute的meta系統內部後,即可輕鬆實現對TableStore資料的處理。本節將以下述樣本為例,來為您說明MaxCompute對接TableStore的一些概念和實現。
DROP TABLE IF EXISTS ots_table_external;
CREATE EXTERNAL TABLE IF NOT EXISTS ots_table_external
(
odps_orderkey bigint,
odps_orderdate string,
odps_custkey bigint,
odps_orderstatus string,
odps_totalprice double
)
STORED BY 'com.aliyun.odps.TableStoreStorageHandler' -- (1)
WITH SERDEPROPERTIES ( -- (2)
'tablestore.columns.mapping'=':o_orderkey,:o_orderdate,o_custkey, o_orderstatus,o_totalprice', -- ①
'tablestore.table.name'='ots_tpch_orders' -- ②
'odps.properties.rolearn'='acs:ram::xxxxx:role/aliyunodpsdefaultrole' --③
)
LOCATION 'tablestore://odps-ots-dev.cn-shanghai.ots-internal.aliyuncs.com'; -- (3)
語句說明如下所示:
(1)com.aliyun.odps.TableStoreStorageHandler是MaxCompute內建的處理TableStore資料的StorageHandler,定義了MaxCompute和TableStore的互動,相關邏輯由MaxCompute實現。
(2)SERDEPROPERITES是提供參數選項的介面,在使用TableStoreStorageHandler時,有兩個必須指定的選項,分別是下文介紹的tablestore.columns.mapping、tablestore.table.name和odps.properties.rolearn。
- 以
:
打頭的用來表示Table Store主鍵,例如此語句中的:o_orderkey
和:o_orderdate
,其他的均為屬性列。 - Table Store支援1-4個主鍵,主鍵類型為String、Integer和Binary,其中第一個主鍵為分區鍵。
- 在指定映射時,您必須提供指定Table Store表的所有主鍵,對於屬性列則沒有必要全部提供,可以只提供需要通過MaxCompute來訪問的屬性列。
②tablestore.table.name:需要訪問的Table Store表名。如果指定的Table Store表名錯誤(不存在),則會報錯,MaxCompute不會主動去建立Table Store表。
③odps.properties.rolearn中的資訊是RAM中AliyunODPSDefaultRole的Arn資訊。您可以通過RAM控制台中的角色詳情進行擷取。
(3)LOCATION clause:用來指定Table Storeinstance名字、endpoint等具體資訊。這裡的Table Store資料的安全訪問建立在前文介紹的RAM/STS授權的前提上。
desc extended <table_name>;
在返回的資訊裡,除了跟內部表一樣的基礎資訊外,Extended Info包含外部表格StorageHandler 、Location等資訊。
查詢外部表格
SELECT odps_orderkey, odps_orderdate, SUM(odps_totalprice) AS sum_total
FROM ots_table_external
WHERE odps_orderkey > 5000 AND odps_orderkey < 7000 AND odps_orderdate >= '1996-05-03' AND odps_orderdate < '1997-05-01'
GROUP BY odps_orderkey, odps_orderdate
HAVING sum_total> 400000.0;
由上可見,使用常見的MaxCompute SQL文法,訪問Table Store的所有細節由MaxComput 內部處理。這包括在列名的選擇上,比如上述SQL中,使用的列名是odps_orderkey,odps_totalprice等,而不是原始Table Store中的主鍵名o_orderkey或屬性列名o_totalprice,因為在建立External Table的DDL語句中,已經做了對應的mapping。當然您也可根據自己的需求在建立External Table時選擇保留原始的TableStore主鍵/列名。
CREATE TABLE internal_orders AS
SELECT odps_orderkey, odps_orderdate, odps_custkey, odps_totalprice
FROM ots_table_external
WHERE odps_orderkey > 5000 ;
現在internal_orders就是一個MaxCompute表了,也擁有所有MaxCompute內部表的特性,包括高效的壓縮列儲存資料格式、完整的內部宏資料以及統計資訊等。同時因為儲存在MaxCompute內部,訪問速度會比訪問外部的Table Store更快,尤其適用於需要進行多次計算的熱點資料。
MaxCompute匯出資料到Table Store
INSERT OVERWRITE TABLE ots_table_external
SELECT odps_orderkey, odps_orderdate, odps_custkey, CONCAT(odps_custkey, 'SHIPPED'), CEIL(odps_totalprice)
FROM internal_orders;
對於Table Store這種KV資料的NoSQL儲存介質,從MaxCompute的輸出將隻影響相對應主鍵所在的行,比如樣本中隻影響所有odps_orderkey + odps_orderdate這兩個主索引值能對應行上的資料。而且在這些Tabele Store行上面,也只會去更新在建立External Table(ots_table_external)時指定的屬性列,而不會去修改未在External Table中出現的資料列。