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上的計算生態,實現多種資料來源之間的無縫串連。

TableStore與MaxCompute都有其自身的類型系統。在MaxCompute處理TableStore資料時,兩者之間的類型對應關係如下所示:
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是同一個帳號時,登入阿里雲帳號後,單擊此處完成一鍵授權
  • 自訂授權
    1. 首先在RAM控制台中授予MaxCompute訪問Table Store的許可權。

      登入 RAM控制台(若MaxCompute和Table Store不是同一個帳號,此處需由Table Store帳號登入進行授權),建立角色,角色名稱叫AliyunODPSDefaultRole或AliyunODPSRoleForOtherUser。

    2. 修改策略內容設定,如下所示:
      --當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。



    3. 編輯該角色的授權策略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"
      }
      ]
      }
      --還可自訂其他許可權
    4. 將許可權AliyunODPSRolePolicy授權給該角色。

建立外部表格

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。

①tablestore.columns.mapping選項:必選項,用來描述MaxCompute將訪問的Table Store表的列,包括主鍵和屬性列。
  • :打頭的用來表示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等資訊。

查詢外部表格

建立External Table後,Table Store的資料便引入到了MaxCompute生態中,即可通過正常的MaxCompute SQL文法訪問Table Store資料,如下所示:
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主鍵/列名。

如果需要對一份資料做 多次計算,相較每次從Table Store去遠程讀資料,有個更高效的辦法是先一次性把需要的資料匯入到MaxCompute內部成為一個MaxCompute(內部)表,樣本如下:
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

说明 MaxCompute不會主動建立外部的Table Store表,所以在對Table Store表進行資料輸出之前,必須保證該表已經在Table Store上建立過(否則將報錯)。
根據上面的操作,您已建立了外部表格ots_table_external來打通MaxCompute與Table Storeb資料表ots_tpch_orders的鏈路,同時還有一份儲存在MaxCompute內部表internal_orders的資料,現在希望對internal_orders中的資料進行一定處理後再寫回 Table Store,可通過對外部表格做 INSERT OVERWITE TABLE操作來實現,如下所示:
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中出現的資料列。