MaxCompute はオブジェクトテーブル機能を導入しました。この機能により、データウェアハウスのコンピュートエンジンは、データレイクストレージ内の非構造化データとそのメタデータにアクセスできます。このトピックでは、オブジェクトテーブルのコマンド構文と使用例について説明します。
背景情報
多くの AI ワークフローでは、データとビジネスロジックに精通したデータウェアハウス開発者が、大規模モデルのために非構造化データを前処理または処理する必要があります。これらのタスクでは、ビッグデータプラットフォームの低コストで大規模なコンピューティング能力を活用します。プロセスとその結果は、データウェアハウスまたはデータレイク内のデータと相互作用します。
SQL を使用して非構造化データを処理するには、次の課題があります。
ビッグデータの SQL エンジンは、オブジェクトストレージからファイルを読み取る際にオブジェクトサイズを認識しません。これにより、実行計画の最適化、同時実行数の制御、または適切な数の同時タスクの自動起動が困難になります。さらに、効果的な述語プッシュダウンがないと、特にデータスキューの場合にコンピューティング能力を十分に活用できません。
各クエリでストレージサービスへのリモートコールが必要になるため、オブジェクトストレージからメタデータを読み取ると高いレイテンシーが発生します。
オブジェクトストレージからのファイルリストは、単一プロセスのユーザー定義テーブル関数 (UDTF) でシリアルにしか取得できないため、データ読み取りのパフォーマンスが低下します。
ストレージサービスに接続するには、ユーザー定義関数 (UDF) 内で権限付与ロジックとネットワーク接続ロジックを実装する必要があります。
UDF には、非構造化データを処理する機能に制限があります。従来のデータウェアハウスには、カスタムイメージを柔軟かつ安全にアップロードする機能がなく、UDF のための安全な実行環境も提供されていません。さらに、リモートコールには分散コンピューティングサービスとの複雑な同時実行統合が必要です。
特徴
オブジェクトテーブル機能は、以下の機能を提供します。
Object Storage Service (OSS) ファイルのメタデータへのテーブル形式でのアクセスを提供します。
バージョン管理された OSS ファイルのメタデータをメタデータテーブルにキャッシュします。SQL エンジンはこれを使用して、データフィルタリングや述語プッシュダウンなどのクエリ最適化を行います。
さまざまな方法で非構造化データファイルの内容を読み取るための組み込みドキュメント関数を提供します。
MaxCompute SQL エンジンがオブジェクトテーブルのメタデータから同時スプリットを作成できるようにし、より効率的なデータ読み取りと処理のために大規模な分散コンピューティングを可能にします。
カスタムイメージをアップロードして、非構造化データを処理するための UDF を構築できます。
非構造化データを処理して構造化された結果を生成し、それをデータウェアハウスの内部テーブルまたは外部テーブルに書き込むことをサポートします。将来のバージョンでは、非構造化された結果を生成し、オブジェクトテーブルを介して Object Storage Service (OSS) に書き戻すこともサポートする予定です。
Python エコシステムの Maxframe エンジンをサポートします。
制限事項
MaxCompute プロジェクトでスキーマ機能を有効にする必要があります。詳細については、「スキーマ機能を有効にする」をご参照ください。
MaxCompute は Type System 2.0 をサポートしている必要があります。
オブジェクトテーブルは現在、パーティションをサポートしていません。
課金
オブジェクトテーブルに格納されているメタデータに対して課金されます。詳細については、「ストレージ料金」をご参照ください。MaxCompute は実際の OSS ファイルのストレージに対しては課金しませんが、データストレージとアクセスに対する標準の OSS 料金が適用されます。詳細については、「OSS ストレージ料金」をご参照ください。
OSS メタデータを抽出および更新するタスクの場合、スキャンされる各ファイルの
inputsizeは、実際のファイルサイズではなく、そのメタデータサイズに基づきます。したがって、更新タスクの総コストは、実際のファイルサイズではなく、ファイル数に依存します。詳細については、「」外部テーブルの SQL 課金をご参照ください。オブジェクトテーブルを使用して OSS から非構造化データを分析および抽出する場合、コンピューティング料金が適用されます。
従量課金では、オブジェクトテーブルのメタデータの分析は内部テーブルと同じように課金されます。詳細については、「」標準 SQL 課金をご参照ください。OSS からの非構造化データコンテンツの処理は、外部テーブルとして課金されます。詳細については、「」外部テーブルの SQL 課金をご参照ください。
サブスクリプションモデルでは、コンピューティングはプリペイドリソースを使用します。詳細については、「コンピューティング料金 (サブスクリプション)」をご参照ください。
オブジェクトテーブルの作成
構文
CREATE OBJECT TABLE [IF NOT EXISTS] <objecttable_name>
WITH SERDEPROPERTIES ('<key>' = '<value>')
LOCATION '<location>'
[TBLPROPERTIES ('<key>' = '<value>')]
[COMMENT '<comment>']
;オブジェクトテーブルは、スキーマ機能が有効になっているプロジェクトでのみ使用できます。スキーマ構文も有効にする必要があります。
オブジェクトテーブルのメタデータ列はシステムによって提供されるため、列を定義する必要はありません。
パラメーター
パラメーター | 必須 | 説明 |
objecttable_name | はい | テーブルの名前。 |
SERDEPROPERTIES ('<key>'='<value>') | はい |
|
location | はい |
|
TBLPROPERTIES ('<key>'='<value>') | いいえ |
|
comment | いいえ | テーブルのコメント。 |
例
SET odps.namespace.schema=true;
CREATE OBJECT TABLE ot_demo_day
WITH serdeproperties (
'odps.properties.rolearn'='acs:ram::xxxxxx:role/aliyunodpsdefaultrole')
LOCATION 'oss://oss-cn-hangzhou-internal.aliyuncs.com/odps-external-****/ottest/';オブジェクトテーブルのプロパティの表示
構文
DESC <object_table_name>パラメーター
object_table_name:必須。テーブルの名前。
例
SET odps.namespace.schema=true;
DESC ot_demo_day; 次の結果が返されます。
+------------------------------------------------------------------------------------+
| Owner: ALIYUN$****@test.aliyunid.com |
| Project: test_objecttable |
| Schema: default |
| TableComment: |
+------------------------------------------------------------------------------------+
| CreateTime: 2024-09-02 20:01:56 |
| LastDDLTime: 2024-09-02 20:01:56 |
| LastModifiedTime: 2024-09-02 20:01:56 |
+------------------------------------------------------------------------------------+
| InternalTable: YES | Size: 0 |
+------------------------------------------------------------------------------------+
| Native Columns: |
+------------------------------------------------------------------------------------+
| Field | Type | Label | Comment |
+------------------------------------------------------------------------------------+
| key | varchar(2048) | | The name of the object. |
| size | bigint | | The size of the returned object in bytes. |
| type | varchar(32) | | The type of the object and valid values: Normal, Multipart, Appendable, and Symlink. |
| last_modified | timestamp | | The last modified time of the object. |
| storage_class | varchar(32) | | The storage class of the object. |
| etag | varchar(64) | | The entity tag (ETag). When an object is created, an ETag is created to identify the content of the object. |
| restore_info | varchar(256) | | The restoration status of the object. |
| owner_id | bigint | | The ID of the bucket owner. |
| owner_display_name | varchar(256) | | The display name of the bucket owner. |
+------------------------------------------------------------------------------------+次の表に、結果の主要な列を示します。
列名 | 型 | Null 許容 | 説明 |
key | VARCHAR(2048) キーは最大 1,023 文字です。 詳細については、「OSS オブジェクトの命名規則と例」をご参照ください。 | False | オブジェクトテーブル内のオブジェクトの相対パス。 |
size | BIGINT | False | オブジェクトのサイズ (バイト単位)。 |
type | VARCHAR(32) | False | OSS 内のオブジェクトのタイプ:Normal、Multipart、Appendable、または Symlink。 |
last_modified | TIMESTAMP_NTZ | False | OSS でオブジェクトのデータが最後に変更された時刻。 |
storage_class | VARCHAR(32) | False | OSS 内のオブジェクトのストレージクラス。詳細については、「ストレージクラス」をご参照ください。 |
etag | VARCHAR(64) | False | ETag (エンティティタグ) は、オブジェクトが生成されるときに作成されます。これは、更新間でオブジェクトのコンテンツが変更されたかどうかを識別するために使用されますが、一意の識別子ではありません。 |
restore_info | VARCHAR(256) | True | コールドストレージからのオブジェクトの解凍ステータスに関する情報。 |
owner_id | BIGINT | True | オブジェクトの所有者の ID。 |
owner_display_name | VARCHAR(256) | True | オブジェクトの所有者の表示名。 |
CREATE TABLE 文の表示
構文
SHOW CREATE TABLE <object_table_name>;パラメーター
object_table_name:必須。テーブルの名前。
例
SET odps.namespace.schema=true;
SHOW CREATE TABLE ot_demo_day; 次の結果が返されます。
CREATE OBJECT TABLE IF NOT EXISTS yunqi_object_****.`default`.ot_demo_day
WITH SERDEPROPERTIES (
'serialization.format'='1',
'odps.properties.rolearn'='acs:ram::139699392458****:role/aliyunodpsdefaultrole')
LOCATION
'oss://oss-cn-hangzhou-internal.aliyuncs.com/odps-external-****/ottest/'
TBLPROPERTIES (
'last_modified_time'='1731478307',
'transient_lastDdlTime'='1731478307',
'metadata.cache.mode'='manual',
'metadata.staleness.seconds'='3600');オブジェクトテーブルのメタデータの更新
オブジェクトテーブルの実際のデータは OSS に保存されます。MaxCompute はこれらのオブジェクトのメタデータをキャッシュし、このキャッシュされたメタデータをクエリや計算に使用します。したがって、オブジェクトテーブルを使用する前にキャッシュを更新する必要があります。メタデータは手動で更新するか、テーブル作成時に定期的な更新を設定できます。
手動更新と定期更新はどちらも完全更新です。
手動更新
各更新はメタデータの完全な同期を実行します。これらの更新のタイミングと頻度を制御できます。
構文
ALTER TABLE <objecttable_name> REFRESH METADATA;パラメーター
objecttable_name:必須。テーブルの名前。
例
SET odps.namespace.schema=true; ALTER TABLE ot_demo_day REFRESH METADATA;
定期更新
オブジェクトテーブルにマップされた OSS ディレクトリ内のファイルが頻繁に変更される場合は、定期的なメタデータ更新を設定できます。メンテナンスコストを削減するために、テーブル作成時に更新パラメーターを指定します。
構文
SET odps.namespace.schema=true; SET odps.sql.type.system.odps2 = true; CREATE OBJECT TABLE ot_demo_day WITH serdeproperties ( 'odps.properties.rolearn'='acs:ram::xxxxxx:role/aliyunodpsdefaultrole' ) location 'oss://oss-cn-hangzhou-internal.aliyuncs.com/odps-external-****/ottest/' tblproperties ( 'metadata.cache.mode' = 'periodic', 'metadata.staleness.seconds' = '3600' );パラメーター
metadata.staleness.seconds:更新間隔。このパラメーターはperiodicモードで必須です。値は[1, 604800]の範囲内である必要があります。これは 1 秒から 1 週間の範囲を表します。metadata.cache.mode:更新モード。次のいずれかのオプションを選択します。periodic:定期的に更新をトリガーします。crontab:スケジュールに基づいて更新をトリガーします。manual:手動で更新をトリガーします (デフォルト)。トリガーのタイミングを制御できます。
スケジュール更新
オブジェクトテーブルにマップされた OSS ディレクトリ内のファイルが頻繁に変更される場合は、メタデータの更新をスケジュールできます。メンテナンスコストを削減するために、テーブル作成時にスケジューリングパラメーターを指定します。
構文
SET odps.namespace.schema=true; SET odps.sql.type.system.odps2 = true; CREATE OBJECT TABLE ot_demo_day WITH SERDEPROPERTIES ( 'odps.properties.rolearn'='acs:ram::xxxxxx:role/aliyunodpsdefaultrole' ) LOCATION 'oss://oss-cn-region-internal.aliyuncs.com/odps-external-****/ottest/' TBLPROPERTIES ( 'metadata.cache.mode' = 'crontab', 'metadata.crontab.expression' = 'your_timed_expression' );パラメーター
metadata.crontab.expression:定期タスクの cron 式。たとえば、毎日午後 2:00 にタスクを 1 回トリガーするには、式を0 0 14 * * ?に設定できます。これは、0秒、0分、14時 (14:00 または午後 2:00)、*(毎日)、*(毎月)、?(曜日未指定、競合を避けるために日付フィールドと相互排他的) を意味します。metadata.cache.mode: リフレッシュモード。次のいずれかのオプションを選択します:crontab:スケジュールに基づいて更新をトリガーします。periodic:定期的に更新をトリガーします。manual:手動で更新をトリガーします (デフォルト)。トリガーのタイミングを制御できます。
更新タスクの表示
次のコマンドを実行して、更新タスクの履歴を表示できます。
SHOW refresh task history FOR object TABLE <object_table_name>;パラメーター
<object_table_name> はオブジェクトテーブルである必要があります。
戻り値:更新タスクのインスタンス ID (
InstanceId)、作成時刻 (CreateTime)、終了時刻 (EndTime)、および実行ステータス (Status)。Status が Failed の場合、
wait InstanceId;を実行してログビューを表示し、エラーの詳細を確認できます。
例
-- オブジェクトテーブルの履歴更新タスクを表示します。 SET odps.namespace.schema=true; SHOW refresh task history for object table ot_demo_day04; -- 次の結果が返されます。 ID = 20260105*******f +---------------------------------------------------------------------------------------------------+ | Project: test_project | | Schema: default | | Task: *** | +---------------------------------------------------------------------------------------------------+ | History: | +---------------------------------------------------------------------------------------------------+ | InstanceId | CreateTime | EndTime | Status | +---------------------------------------------------------------------------------------------------+ | 20260105******************ks | 2026-01-05 14:12:00 | 2026-01-05 14:12:04 | Terminated | | 20260105******************y3 | 2026-01-05 14:10:00 | 2026-01-05 14:10:03 | Terminated | +---------------------------------------------------------------------------------------------------+ OK
オブジェクトテーブルのクエリ
オブジェクトテーブルが OSS ディレクトリからファイルのメタデータをフェッチした後、テーブルをクエリしてこのメタデータを閲覧できます。また、SQL ステートメントを使用して、集約、結合、ウィンドウ関数、ORDER BY、LIMIT などのメタデータに対する計算を実行することもできます。
構文
SELECT * FROM <object_table_name>;パラメーター
object_table_name:必須。テーブルの名前。
例
-- 指定された OSS ディレクトリにアップロードされたデータをクエリします。データ量が多い場合は、結果を 5 行に制限できます。
SET odps.namespace.schema=true;
SELECT * FROM ot_demo_day [limit 5];疑似列を使用したオブジェクトのバイナリデータのクエリ
疑似列はシステムによって自動的に生成され、オブジェクトテーブルの作成時に定義する必要はありません。オブジェクトのバイナリデータは、次の 3 つの方法で疑似列を介して直接クエリできます。
_data 列
_data 列は、イメージのバイナリストリームなど、オブジェクトの完全なバイナリデータを返します。そのデータ型は BINARY です。
単一オブジェクトのバイナリデータが大きすぎると、メモリ不足エラーが発生する可能性があります。
_data 列は使いやすく、多くの既存の関数と連携します。
使用法:
SET odps.namespace.schema=true; SELECT _data FROM test_ot1;_blob 列
_blob 列は、バイナリデータ自体ではなく、バイナリデータをダウンロードするための参照リンクを返します。これにより、実際のデータの読み取りを遅延させ、SQL オペレーターを通過する際のメモリ消費を制御します。そのデータ型は Blob です。詳細については、「Blob データ型とマルチモーダルストレージ」をご参照ください。
_data 列と比較して、_blob 列は計算の安定性とリソース消費の点で利点があります。
比較的小さなオブジェクト (平均 1 MB 未満) の場合は、_data 列を推奨します。
大きなオブジェクトの場合は、_blob 列を推奨します。_blob 列は遅延消費をサポートし、データが SQL オペレーターを通過する際のメモリ使用量を削減します。データは、BLOB 型を処理できるオペレーターまたは関数に到達したときにのみストリームとして消費され、遅延消費と制御されたメモリ使用量を可能にします。
使用法:
SET odps.namespace.schema=true; SELECT _blob FROM test_ot1;_signed_url 列
_signed_url 列は、ログインせずにバイナリデータをアップロードまたはダウンロードするための URL を提供します。_signed_url 列は、システム、プログラム、またはヘテロジニアス環境間でのアクセスに推奨されます。
使用法:
SET odps.namespace.schema=true; SELECT _signed_url FROM test_ot1;
例
_data 列
テストファイルをダウンロードして OSS にアップロードします: ot_test.txt。
オブジェクトテーブルを作成します。
SET odps.namespace.schema=true; SET odps.sql.type.system.odps2=true; SET odps.mcqa.disable=TRUE; DROP TABLE IF EXISTS test_ot1; CREATE OBJECT TABLE test_ot1 LOCATION 'oss://oss-cn-<region>-internal.aliyuncs.com/<bucket name>/<file path>/'; -- テーブルキャッシュを更新します。 ALTER TABLE test_ot1 REFRESH METADATA; SET odps.mcqa.disable=TRUE; SET odps.namespace.schema=true; SELECT * FROM test_ot1; -- 次の結果が返されます。 +------+------------+------+---------------+---------------+------+--------------+------------+--------------------+ | key | size | type | last_modified | storage_class | etag | restore_info | owner_id | owner_display_name | +------+------------+------+---------------+---------------+------+--------------+------------+--------------------+ | ot_test.txt | 286 |Normal|2026-07-21 06:49:59| Standard | 3*01 | NONE | 1***279014 | 1***279014 | +------+------------+------+---------------+---------------+------+--------------+------------+--------------------+_data 列を読み取ります。
SET odps.namespace.schema=true; SELECT _data FROM test_ot1; -- 次の結果が返されます。 +-------+ | _data | +-------+ | {=0A=20=20"id":=20**1,=0A=20=20"title":=20"Hello=20World",=0A=20=20"description":=20"=E8=BF**E4=BE=8B=20JSON=20=**82",=0A=20=20"tags":=20[=0A*=20"=E7**=8B",=0A=20=20=20=20"JSON",=0A=20=20=20=20"Example"=0A=20=20],=0A=20=20"metadata":=20{=0A=20=20=20=20"author":=20"AI=20Assistant",=0A=20=20=20=20"created_at":=20"2023-10-01T12:00:00Z",=0A=20=20=20=20"is_active":=20true=0A=20=20}=0A} |テキストコンテンツを表示します。
SET odps.namespace.schema=true; SELECT CAST(_data AS STRING) FROM test_ot1; -- 次の結果が返されます。 +-----+ | _c0 | +-----+ | { "id": 1001, "title": "Hello World", "description": "这是一个包含中英文的示例 JSON 数据。", "tags": [ "编程", "JSON", "Example" ], "metadata": { "author": "AI Assistant", "created_at": "2023-10-01T12:00:00Z", "is_active": true } } | +-----+
_blob 列
テストファイルをダウンロードして OSS にアップロードします: ot_test.txt。
オブジェクトテーブルを作成します。
SET odps.namespace.schema=true; SET odps.sql.type.system.odps2=true; SET odps.mcqa.disable=TRUE; DROP TABLE IF EXISTS test_ot1; CREATE OBJECT TABLE test_ot1 LOCATION 'oss://oss-cn-<region>-internal.aliyuncs.com/<bucket name>/<file path>/'; -- テーブルキャッシュを更新します。 ALTER TABLE test_ot1 REFRESH METADATA; SET odps.mcqa.disable=TRUE; SET odps.namespace.schema=true; SELECT * FROM test_ot1; -- 次の結果が返されます。 +------+------------+------+---------------+---------------+------+--------------+------------+--------------------+ | key | size | type | last_modified | storage_class | etag | restore_info | owner_id | owner_display_name | +------+------------+------+---------------+---------------+------+--------------+------------+--------------------+ | ot_test.txt | 286 |Normal|2026-07-21 06:49:59| Standard | 3*01 | NONE | 1***279014 | 1***279014 | +------+------------+------+---------------+---------------+------+--------------+------------+--------------------+_blob 列を読み取ります。
SET odps.namespace.schema=true; SELECT _blob FROM test_ot1; -- 次の結果が返されます。 +-------+ | _blob | +-------+ | CAEQAxruAgEAAAANA**AAEb2svMjAy3CIAKhR5WVBc/0S4GmxSm4psPJ5CV3k4STIeCgl***FyYTQ1ZXEx | +-------+テキストコンテンツを表示します。
SET odps.namespace.schema=true; SELECT CAST(read_blob(_blob) AS STRING) FROM test_ot1; -- 次の結果が返されます。 +-----+ | _c0 | +-----+ | { "id": 1001, "title": "Hello World", "description": "这是一个包含中英文的示例 JSON 数据。", "tags": [ "编程", "JSON", "Example" ], "metadata": { "author": "AI Assistant", "created_at": "2023-10-01T12:00:00Z", "is_active": true } } | +-----+
オブジェクトテーブルの削除
オブジェクトテーブルはファイルメタデータをキャッシュし、ストレージを消費してコストが発生します。キャッシュされたデータが不要になった場合は、オブジェクトテーブルを削除します。必要に応じて後で再作成できます。
構文
DROP TABLE [IF EXISTS] <object_table_name>; パラメーター
object_table_name:必須。テーブルの名前。
例
SET odps.namespace.schema=true;
DROP TABLE IF EXISTS ot_demo_day;よくある質問
ODPS-0010000:System internal error
現象
次のエラーメッセージが表示されます。
ODPS-0010000:System internal error - ActionHandler job failed with failinfo storage service worker error occured: common/io/oss/oss_file_system_cppsdk.cpp(919): OSSRequestException: Status: -50, RequestId: , ErrorCode: ClientError:-50, Message: E_HTTP_ERROR_CONN_REFUSED原因
オブジェクトテーブルの作成時に OSS のパブリックエンドポイントを使用しました。
解決策
オブジェクトテーブルを作成する際、
locationパラメーターのoss_endpointは内部エンドポイントである必要があります。内部エンドポイントの取得方法については、「パラメーター」をご参照ください。内部エンドポイントに切り替えてもエラーが解決しない場合は、チケットを起票して MaxCompute のテクニカルサポートチームにご連絡ください。
定期更新の失敗
現象
オブジェクトテーブルの作成時に定期更新パラメーターを設定しましたが、指定された間隔で更新が実行されません。
解決策
オブジェクトテーブルの作成時に設定した location パラメーターが OSS の内部エンドポイントを指定していることを確認してください。オブジェクトテーブルの作成方法の詳細については、「パラメーター」をご参照ください。