このドキュメントでは、Table Store から MaxCompute コンピューティング環境にデータをインポートする方法を説明します。 これにより、複数のデータソース間のシームレスな接続が可能になります。

Table Store は、Alibaba Cloud の Apsara 分散ファイルシステム上に構築された NoSQL データベースサービスです。ユーザーは、膨大な量の構造化データをリアルタイムで保存し、アクセスすることができます。 Table Store の詳細については、「Table Store の概要」をご参照ください。

MaxCompute と TableStore は、2 つの独立したビッグデータコンピューティングサービスとストレージサービスです。 したがって、これら 2 つのサービスの間のネットワークが有効であることを確認する必要があります。 MaxCompute のパブリッククラウドサービスが Table Store に保存されているデータにアクセスする場合、Table Store のプライベートネットワークアドレスを使用することを推奨します。通常、ホスト名の末尾に 'ots-internal.aliyuncs.com' を付けたものです。例: tablestore://odps-ots-dev.cn-shanghai.ots-internal.aliyuncs.com

他のドキュメントで、OSS 非構造化データへのアクセスの使い方を説明しました。

Table Store と MaxCompute はどちらも独自の型システムを持っています。 Table Store と MaxCompute はどちらも独自のデータ型システムを持っています。 MaxCompute で Table Store データを処理する場合、データ型の関連付けは次のとおりです。
MaxCompute 型 TableStore 型
STRING STRING
BIGINT INTEGER
DOUBLE Double
BOOLEAN BOOLEAN
BINARY BINARY

STS モードでの権限付与

MaxCompute から Table Store データにアクセスするには、安全な権限付与手段が必要です。 この問題に関して、MaxCompute は Alibaba Cloud Resource Access Management (RAM) と Token Service (STS) を統合して安全なデータアクセスを実装します。

次の 2 つの方法で権限を付与できます。
  • MaxCompute と Table Store の所有者が同じアカウントの場合は、Alibaba Cloud アカウントで直接ログインし、ここをクリックして権限を付与します。
  • カスタム権限付与
    1. まず、RAM コンソールで、Table Store アクセス権限を MaxCompute に付与する必要があります。

      RAM コンソールにログイン (MaxCompute と Table Store が同じアカウントでない場合は、Table Store アカウントでログインして権限を付与する必要があります) し、ロール AliyunODPSDefaultRole を作成します。

    2. ポリシーの内容を次のように設定します。
      --if MaxCompute and Table Store are same account  
      {
      "Statement": [
      {
       "Action": "sts:AssumeRole",
       "Effect": "Allow",
       "Principal": {
         "Service": [
           "odps.aliyuncs.com"
         ]
       }
      }
      ],
      "Version": "1"
      }
      --if MaxCompute and Table Store are not the same account
      {
      "Statement ":[
      {
       "Action": "sts:AssumeRole",
       "Effect": "Allow",
       "Principal": {
         "Service": [
           "MaxCompute's Owner cloud account 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"
      }
      ]
      }
      --You can also customize other permissions
    4. このロールに AliyunODPSRolePolicy 権限を付与します。

外部テーブルの作成

MaxCompute では、外部テーブルを作成し、Table Store テーブルデータ記述を MaxCompute メタシステムに追加した後、Table Store データを処理できるようになります。 次の例は、MaxCompute の Table Store アクセスで使用される概念と操作を示しています。

次の文を使用して、外部テーブルを作成します。
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)
文の説明を以下に示します。
  • com.aliyun.odps.TableStoreStorageHandler は、Table Store データを処理するための MaxCompute の組み込み StorageHandler です。 これは、MaxCompute と Table Store 間の相互作用を定義します。 関連ロジックは MaxCompute によって実装されています。
  • SERDEPROPERITES は、パラメーターオプションを提供するインターフェイスです。 TableStoreStorageHandler を使用する際、tablestore.columns.mappingtablestore.table.nameodps.properties.rolearn から 2 つオプションを指定する必要があります。
    1. filepathtablestore.columns.mapping optionfilepath: MaxCompute がアクセスしようとしている Table Store テーブルの列を照会するのに必要です。
      • 列名の先頭の : は、Table Store の主キーを示します。 この例では、:o_orderkey:o_orderdate が主キー列で、それ以外はすべて属性列です。
      • Table Store は最大 4 つの主キーをサポートします。 主キーは、STRING、INTEGER、および BINARY データ型をサポートします。 最初の主キーはパーティションキーです。
      • マッピング関係を指定するとき、指定した Table Store テーブルのすべての主キーを指定する必要がありますが、すべての属性列を指定する必要はなく、MaxCompute を使用してアクセスする必要がある属性列のみを指定します。
    2. filepathtablestore.table.namefilepath: アクセスする必要がある Table Store テーブルの名前。 誤った Table Store テーブル名 (存在しないテーブルなど) を指定した場合、システムはエラーを報告します。 MaxCompute は、指定された名前で新しい Table Store テーブルを作成しません。
    3. odps.properties.rolearn: RAM の AliyunODPSDefaultRole にある Arn 情報。 RAM コンソールの [ロールの詳細] から取得できます。
  • LOCATION 句: Table Store インスタンス名、エンドポイントなどを指定するための特定の情報。 ここでの Table Store データへの安全なアクセスは、前述の RAM/STS 権限付与の前提に基づいています。
作成した外部テーブル構造を表示する場合、次の文を実行します。
desc extended <table_name>;

返された情報の "Extended Info" には、StorageHandler や Location などの外部テーブル情報が含まれています。

外部テーブルを使用したテーブルデータへのアクセス

外部テーブルを作成した後、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 の詳細はすべて MaxCompute で処理されます。 これには、列名の選択も含まれます。 たとえば、前述の SQL 文で使用されている列名 (odps_orderkey や odps_totalprice など) は、Table Store で使用されている元の主キー名 (o_orderkey) や属性列名 (o_totalprice) ではありません。 これは、外部テーブルの作成時に使用された DDL 文で、マッピングが既に実行されているためです。 外部テーブルを作成するときに元の Table Store の主キー/列名を保持できます。

1 つのデータセットに対して複数の計算を実行する場合、毎回 Table Store からデータをリモートで読み取るのではなく、必要なデータをすべて MaxCompute にインポートして、MaxCompute (内部) テーブルを作成することができます。 例:
CREATE TABLE internal_orders AS
SELECT odps_orderkey, odps_orderdate, odps_custkey, odps_totalprice
FROM ots_table_external
Where fig> 5000;

internal_orders は、MaxCompute 内部テーブルのすべての機能を備えた MaxCompute テーブルです (効率的に圧縮された列ストレージデータ形式、完全な内部マクロデータ、統計情報など)。 また、データは MaxCompute に保存されるため、外部の Table Store データにアクセスする場合よりもアクセス速度が速くなります。 これは、頻繁に計算されるホットスポットデータに特に適しています。

MaxCompute データの Table Store へのエクスポート

MaxCompute は 外部 Table Store テーブルを直接作成しません。したがって、Table Store テーブルにデータを出力する前に、このテーブルが既に作成されていることを確認する必要があります (作成されていない場合、システムがエラーを報告します)。
上記の操作では、MaxCompute と Table Store テーブル ots_tpch_orders を接続するための外部テーブル ots_table_external が作成され、内部 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;
ODPS テーブル自体のデータに特定の順序がある場合 (主キーに従って1 度ソートする、など)、OTS テーブルへの書込み時に OTS パーティションに負荷が集中します。これは、分散書き込みの特性をフルに活用できないことを意味します。 したがって、このような場合は、まず distribute by Rand () を介してデータを分散させることを推奨します。
INSERT OVERWRITE TABLE ots_table_external
SELECT odps_orderkey, odps_orderdate, odps_custkey, CONCAT(odps_custkey, 'SHIPPED'), CEIL(odps_totalprice)
FROM (SELECT * FROM internal_orders DISTRIBUTE BY rand()) t;

Table Store は KV データの NoSQL ストレージメディアであるので、MaxCompute からのデータ出力は対応する主キーを持つ行にのみ影響します。 この例では、出力は対応する dps_orderkey + odps_orderdate 主キー値を持つ行内のデータにのみ影響します。 また、Table Store 行では、外部テーブル (ots_table_external) の作成中に指定された属性列のみが更新されます。 外部テーブルに表示されないデータ列は変更されません。

  • MaxCompute 内のデータを一度に 4 MB を超えて OTS に書き込むことはできません。それ以外の場合は、サイズの大きすぎるデータを削除して書き戻す必要があります。 この時点でエラーが発生する可能性があります。
    ODPS-0010000:System internal error - Output to TableStore failed with exception:
    TableStore BatchWrite request id XXXXX failed with error code OTSParameterInvalid and message:The total data size of BatchWriteRow request exceeds the limit
  • データを一括で、またはブランチ単位で書き込むのは、1 回の操作です。 詳細は、「 BatchWriteRow」をご参照ください。 したがって、一括書き込みデータの量が大きすぎる場合は、ブランチ書き込みも可能です。
  • データを一括で書き込む場合、重複する行がないことに注意してください。そうしないと、エラーが報告される可能性があります。
    Errorcode: FIG, errormessage: the input parameter is invalid 

    詳細については、「BatchWriteRow を使用して一度に 100 個のデータを送信すると、OTSParameterInvalid エラーが報告される」をご参照ください。