このトピックでは、Tablestore (Open Table Service、旧称 OTS) から MaxCompute にデータをインポートして、複数のデータソースをシームレスに接続する方法について説明します。
背景情報
Tablestore は、Alibaba Cloud Apsara 分散システム上に構築された NoSQL データストレージサービスです。Tablestore は、大量の構造化データへのストレージとリアルタイムアクセスを提供します。詳細については、「Tablestore ドキュメント」をご参照ください。
DataWorks を MaxCompute と組み合わせて使用すると、外部テーブルの作成、検索、クエリ、設定、処理、分析を視覚的に行うことができます。詳細については、「外部テーブル」をご参照ください。
注意事項
MaxCompute と Tablestore 間のネットワーク接続を確保する必要があります。パブリッククラウドの MaxCompute から Tablestore データにアクセスする場合、Tablestore のプライベートエンドポイントを使用することをお勧めします。プライベートエンドポイントは ots-internal.aliyuncs.com で終わり、たとえば tablestore://odps-ots-dev.cn-shanghai.ots-internal.aliyuncs.com のようになります。
Tablestore と MaxCompute は異なるデータ型システムを使用します。次の表に、Tablestore と MaxCompute でサポートされているデータ型のマッピングを示します。
MaxCompute タイプ
Tablestore タイプ
STRING
STRING
BIGINT
INTEGER
DOUBLE
DOUBLE
BOOLEAN
BOOLEAN
BINARY
BINARY
Tablestore 外部テーブルはクラスタリング属性をサポートしていません。
前提条件
Tablestore にアクセスするための権限が付与されている必要があります。権限付与の詳細については、「Tablestore の STS 権限付与」をご参照ください。
Tablestore インスタンス、テーブル、およびデータが作成されている必要があります。詳細については、「ワイドテーブルモデルのクイックスタート」をご参照ください。
外部テーブルの作成
MaxCompute は外部テーブル機能を提供します。外部テーブルを使用して、Tablestore から MaxCompute のメタシステムにデータをインポートして処理できます。次のセクションでは、Tablestore 外部テーブルを作成する方法について説明します。
以下は、CREATE FOREIGN TABLE 文の例です。
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,
odps_createdate timestamp
)
STORED BY 'com.aliyun.odps.TableStoreStorageHandler'
WITH SERDEPROPERTIES (
'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',
'tablestore.read.mode'='permissive',
'tablestore.corrupt.column'='ColumnName',
'tablestore.timestamp.ticks.unit'='seconds',
'tablestore.column.odps_createdate.timestamp.ticks.unit'='millis',
'tablestore.table.put.row'='true'
)
LOCATION 'tablestore://odps-ots-dev.cn-shanghai.ots-internal.aliyuncs.com';次の表に、上記のテーブル作成文で使用される主要なパラメーターを示します。
パラメーター | 必須 | 説明 |
com.aliyun.odps.TableStoreStorageHandler | はい | Tablestore データを処理するために使用される MaxCompute の組み込みストレージハンドラです。ストレージハンドラは MaxCompute と Tablestore 間の相互作用を定義します。関連するロジックは MaxCompute によって実装されます。 |
tablestore.columns.mapping | はい | MaxCompute がアクセスする Tablestore テーブルの列。列には、プライマリキー列と属性列が含まれます。
|
tablestore.table.name | はい | MaxCompute がアクセスする Tablestore テーブルの名前。この例では、名前は |
odps.properties.rolearn | はい | RAM の AliyunODPSDefaultRole の Alibaba Cloud リソースネーム (ARN)。
|
tablestore.timestamp.ticks.unit | いいえ | テーブルレベルの時間型の設定。このパラメーターは、外部テーブルの INTEGER データ型のすべてのフィールドが同じ時間単位を使用することを指定します。有効な値:
|
tablestore.column.<col1_name>.timestamp.ticks.unit | いいえ | 列レベルの時間型の設定。このパラメーターは、外部テーブルの列の時間単位を指定します。有効な値:
説明 tablestore.timestamp.ticks.unit と tablestore.column.<col1_name>.timestamp.ticks.unit の両方が設定されている場合、tablestore.column.<col1_name>.timestamp.ticks.unit パラメーターが優先されます。 |
tablestore.table.put.row | いいえ | PutRow 操作の書き込みモードを指定します。有効な値:
説明 次のフラグパラメーターを設定して、PutRow 操作の書き込みモードを指定できます。デフォルト値は False です。詳細については、「フラグパラメーターリスト」をご参照ください。 |
tablestore.read.mode | いいえ | MaxCompute が Tablestore 外部テーブルでダーティデータを検出した場合の読み取り動作を指定します。有効な値:
ダーティデータ処理の例については、「ダーティデータ処理の例」をご参照ください。 |
tablestore.corrupt.column | いいえ | ダーティデータが書き込まれる列を指定します。
ダーティデータ処理の例については、「ダーティデータ処理の例」をご参照ください。 |
LOCATION | はい | Tablestore インスタンスの名前やエンドポイントなど、Tablestore に関する情報を指定します。Tablestore データへの安全なアクセスを確保するには、RAM またはセキュリティトークンサービス (STS) の権限付与を完了する必要があります。 説明 パブリックエンドポイントの使用時にネットワークタイプが不整合であることを示すエラーが返された場合は、ネットワークタイプをクラシックネットワークに変更できます。 |
次の文を実行して、作成した外部テーブルの構造を表示できます:
DESC extended <table_name>;実行結果では、Extended Info には、外部テーブルの基本情報、ストレージハンドラに関する情報、および外部テーブルの場所が含まれます。
外部テーブルのデータをクエリする
外部テーブルを作成した後、MaxCompute SQL 文を実行して、外部テーブルを使用して Tablestore データにアクセスできます。例:
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 文を使用して Tablestore データにアクセスする場合、列名の選択などのすべての操作は MaxCompute で実行されます。前の例では、列名は odps_orderkey と odps_totalprice であり、Tablestore テーブルのプライマリキー列 o_orderkey と属性列 o_totalprice の名前ではありません。これは、マッピングが外部テーブルの作成に使用される DDL 文で定義されているためです。必要に応じて、Tablestore テーブルのプライマリキー列と属性列の名前を保持することもできます。
1 つのデータを複数回計算する場合は、Tablestore から MaxCompute の内部テーブルにデータをインポートできます。これにより、MaxCompute を使用してデータを計算するたびに 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 テーブルです。internal_orders テーブルは、効率的に圧縮された列のストアを使用し、完全な内部マクロデータと統計情報を含みます。internal_orders テーブルは MaxCompute に保存されます。したがって、Tablestore テーブルよりも高速に internal_orders テーブルにアクセスできます。このメソッドは、複数回計算する必要があるデータに適しています。
MaxCompute から Tablestore へのデータのエクスポート
MaxCompute は宛先の Tablestore テーブルをアクティブに作成しません。Tablestore テーブルにデータをエクスポートする前に、テーブルが存在することを確認してください。そうしないと、エラーが報告されます。
MaxCompute が Tablestore の ots_tpch_orders テーブルにアクセスできるように、ots_table_external という名前の外部テーブルが作成されます。データは internal_orders という名前の内部 MaxCompute テーブルに保存されます。internal_orders テーブルのデータを処理してから、処理されたデータを Tablestore に書き戻す場合は、外部テーブルで insert overwrite table 文を実行できます。例:
INSERT OVERWRITE TABLE ots_table_external
SELECT odps_orderkey, odps_orderdate, odps_custkey, CONCAT(odps_custkey, 'SHIPPED'), CEIL(odps_totalprice)
FROM internal_orders;内部 MaxCompute テーブルのデータがプライマリキーに基づいてソートされている場合、データは Tablestore テーブルの単一のパーティションに書き込まれます。この場合、分散書き込み操作を完全には利用できません。このシナリオでは、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;Tablestore は、キーと値のペアのフォーマットでデータを保存する NoSQL データストレージサービスです。MaxCompute からのデータ出力は、Tablestore テーブルのプライマリキーを含む行にのみ影響します。この例では、odps_orderkey と odps_orderdate を含む行のみが影響を受けます。ots_table_external テーブルの作成時に指定された属性列のみが更新されます。外部テーブルに含まれていない列は変更されません。
MaxCompute から Tablestore に一度に書き込むデータのサイズが 4 MB を超えると、エラーが発生する可能性があります。この場合、余分なデータを削除してから、再度 Tablestore にデータを書き込む必要があります。
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複数のデータエントリを同時に、または行ごとに書き込むことは、単一の操作と見なされます。詳細については、「BatchWriteRow」をご参照ください。一度に大量のデータを書き込みたい場合は、行ごとにデータを書き込むことができます。
一度に複数のデータエントリを書き込む場合は、重複する行を書き込まないようにしてください。重複する行が存在すると、次のエラーが発生する可能性があります:
ErrorCode: OTSParameterInvalid, ErrorMessage: The input parameter is invalid詳細については、「BatchWriteRow を使用して一度に 100 件のデータを送信すると OTSParameterInvalid エラーが発生する」をご参照ください。
Tablestore はキーバリューストアサービスであるため、
insert overwrite tableを使用して Tablestore テーブルにデータを書き込む場合、宛先の Tablestore テーブルのコンテンツ全体はクリアされません。ソーステーブルのキーと一致するキーの値のみが上書きされます。
ダーティデータ処理の例
mf_ots_testという名前の Tablestore テーブルを作成し、データを準備します。詳細については、「ワイドテーブルモデルのクイックスタート」をご参照ください。次のサンプルコードは、Tablestore テーブルのデフォルトデータを示しています。
+----+-----------+---------------------------+ | id | name | desc | +----+-----------+---------------------------+ | 1 | 田中 太郎 | 田中 太郎の説明 | +----+-----------+---------------------------+MaxCompute 外部テーブルを作成します。
CREATE EXTERNAL TABLE IF NOT EXISTS mf_ots_external_permi ( id string, name bigint, desc string, corrupt_col string ) STORED BY 'com.aliyun.odps.TableStoreStorageHandler' WITH SERDEPROPERTIES ( 'tablestore.columns.mapping'=':id,name,desc', 'tablestore.table.name'='mf_ots_test', 'tablestore.read.mode'='permissive', 'tablestore.corrupt.column'='corrupt_col', 'odps.properties.rolearn'='acs:ram::139699392458****:role/aliyunodpsdefaultrole' ) LOCATION 'tablestore://santie-doc.cn-shanghai.ots-internal.aliyuncs.com';次のコードを実行して、MaxCompute external テーブルのデータをクエリします:
-- データのクエリ SELECT * FROM mf_ots_external_permi;次の結果が返されます。エラーフィールドは JSON フォーマットで
corrupt_col列に書き込まれます。+------------+------------+--------------------------+------------------------+ | id | name | desc | corrupt_col | +------------+------------+--------------------------+------------------------+ | 1 | NULL | Description of Zhang San | {"name": "\"Zhang San\""} | +------------+------------+--------------------------+------------------------+説明tablestore.read.mode が設定されていないか、permissive に設定されているが、ダーティデータを書き込む列を指定するために tablestore.corrupt.column が設定されていない場合、外部テーブルをクエリするとエラーメッセージ
"Columns not match with columns mapping and corrupt column"が返されます。
よくある質問
Tablestore 外部テーブルでの SQL ジョブが遅い場合の解決策
Tablestore 外部テーブルでのクエリが遅い
症状
Tablestore 外部テーブルでのクエリが遅いです。同じビジネスデータに対して、1 つのコピーはリアルタイムで Tablestore に書き込まれ、もう 1 つのコピーはスケジュールに従って MaxCompute に書き込まれます。テーブルスキーマとデータ量は同じです。MaxCompute 内部テーブルでのクエリは、Tablestore 外部テーブルでのクエリよりもはるかに高速です。
解決策
この問題は、同じデータセットで複数の計算を実行した場合に発生する可能性があります。クエリごとに Tablestore からデータを読み取る代わりに、より効率的な方法として、必要なデータを MaxCompute 内部テーブルにインポートし、その内部テーブルでクエリを実行します。
SDK を使用した MaxCompute 外部テーブルでのデータ検索が遅い
症状
ソフトウェア開発キット (SDK) を使用した MaxCompute 外部テーブルでのデータ検索が遅いです。
解決策
外部テーブルはフルテーブルスキャンのみをサポートしているため、パフォーマンスが低下する可能性があります。代わりに MaxCompute 内部テーブルを使用してください。