MaxCompute を使用すると、プロジェクト内に Object Storage Service (OSS) 外部テーブルを作成し、OSS 内のディレクトリとマッピングできます。OSS 外部テーブルを活用することで、OSS ディレクトリ内のファイルから非構造化データを読み取ったり、MaxCompute プロジェクトから OSS ディレクトリへデータを書き込んだりできます。本トピックでは、OSS 外部テーブルの作成、読み取り、および書き込みに関する構文とパラメーターについて説明します。
注意事項
OSS 外部テーブルはクラスター属性をサポートしていません。
単一ファイルのサイズは 2 GB を超えてはなりません。2 GB を超えるファイルは分割する必要があります。
MaxCompute と OSS は同一リージョンに配置する必要があります。
アクセス方法
OSS 外部テーブルの作成および読み取り・書き込みには、以下のプラットフォームを使用できます。
方法 | プラットフォーム |
MaxCompute SQL | |
ビジュアライゼーション |
前提条件
MaxCompute プロジェクトを作成済みです。
OSS バケットおよびディレクトリを準備してください。詳細については、「バケットの作成」および「ディレクトリの管理」をご参照ください。
MaxCompute では、OSS 内のディレクトリを自動的に作成できます。SQL ステートメントに外部テーブルおよびユーザー定義関数 (UDF) が含まれる場合、1 つの SQL ステートメントで外部テーブルからの読み取り・書き込みおよび UDF の実行が可能です。従来の手動によるディレクトリ作成方法も引き続きサポートされています。
MaxCompute は一部のリージョンでのみ展開されているため、クロスリージョンのネットワーク接続に問題が生じる可能性があります。OSS バケットは MaxCompute プロジェクトと同じリージョンに配置してください。
権限付与
OSS へのアクセス権限を取得してください。Alibaba Cloud アカウント、RAM ユーザー、または RAM ロールのいずれかを使用して OSS 外部テーブルにアクセスできます。権限付与の詳細については、「OSS に対する STS 権限付与」をご参照ください。
MaxCompute プロジェクト内で CreateTable 権限を取得してください。テーブル操作権限の詳細については、「MaxCompute の権限」をご参照ください。
OSS 外部テーブルの作成
パーティションテーブルおよび非パーティション化テーブル:
この選択肢は、OSS 内のデータファイルのストレージパスに依存します。ファイルがパーティション化されたパスに格納されている場合はパーティションテーブルを作成し、それ以外の場合は非パーティション化テーブルを作成します。
OSS 外部テーブルは、パーティション操作をサポートしています。
ネットワークドメイン名: OSS のクラシックネットワークドメイン名を使用してください。MaxCompute はパブリックネットワークドメイン名のネットワーク接続を保証しません。
OSS 外部テーブルは、OSS ディレクトリへのマッピング情報のみを記録します。OSS 外部テーブルを削除しても、対応する OSS ディレクトリ内のデータファイルは削除されません。
OSS データファイルがアーカイブ済みオブジェクトである場合、まずオブジェクトの解凍を実行する必要があります。
OSS 外部テーブルの作成ステートメントでは、異なる形式のデータファイルに対して異なるパラメーター設定が適用されます。構文およびパラメーターの説明に基づき、ビジネス要件に合致する外部テーブルを作成してください。該当しない場合、OSS からのデータ読み取りまたは書き込み操作は失敗します。
構文
組み込みテキストデータパーサーを使用した外部テーブルの作成
構文 | データファイル形式 | 例 |
| OSS からの読み取り・書き込みでサポートされるデータファイル形式:
|
組み込みオープンソースデータパーサーを使用した外部テーブルの作成
構文 | データファイル形式 | 例 |
| OSS からの読み取り・書き込みでサポートされるデータファイル形式:
|
カスタムパーサーを使用した外部テーブルの作成
構文 | データファイル形式 | 例 |
| OSS からの読み取り・書き込みでサポートされるデータファイル形式: 上記リストにない形式のデータファイル。 |
パラメーター
以下は、各種形式の外部テーブルに共通するパラメーターです。固有のパラメーターについては、各外部テーブル形式のドキュメントをご参照ください。
基本構文パラメーター
パラメーター
必須
説明
mc_oss_extable_name
はい
作成する OSS 外部テーブルの名前。
テーブル名は大文字小文字を区別しません。外部テーブルをクエリする際には大文字小文字を区別する必要はなく、強制的に大文字小文字を変換することもできません。
col_name
はい
OSS 外部テーブル内の列の名前。
OSS からのデータ読み取り時、作成した OSS 外部テーブルのスキーマは OSS データファイルのスキーマと一致している必要があります。そうでない場合、データを読み取ることができません。
data_type
はい
OSS 外部テーブル内の列のデータの型。
OSS からのデータ読み取り時、OSS 外部テーブル内の各列のデータの型は、OSS データファイル内の対応する列のデータの型と一致している必要があります。そうでない場合、データを読み取ることができません。
table_comment
いいえ
テーブルのコメント。コメントは最大 1,024 バイトの有効な文字列である必要があります。それ以外の場合、エラーが報告されます。
partitioned by (col_name data_type, ...)
いいえ
OSS 内のデータファイルがパーティション化されたパスに格納されている場合、パーティションテーブルを作成するためにこのパラメーターを指定します。
col_name: パーティションキー列の名前。
data_type: パーティションキー列のデータの型。
'<(tb)property_name>'='<(tb)property_value>'
はい
OSS 外部テーブルの拡張プロパティ。各形式固有のパラメーターの詳細については、該当するドキュメントをご参照ください。
oss_location
はい
データファイルが格納されている OSS パス。デフォルトでは、このパス内のすべてのデータファイルが読み取られます。
形式は
oss://<oss_endpoint>/<Bucket name>/<OSS directory name>/です。oss_endpoint:
OSS ドメイン名。OSS が提供するクラシックネットワークエンドポイント(
-internalを含む)を使用する必要があります。例:
oss://oss-cn-beijing-internal.aliyuncs.com/xxx。OSS クラシックネットワークドメイン名の詳細については、「リージョンとエンドポイント」をご参照ください。
OSS に格納されているデータファイルのリージョンを、MaxCompute プロジェクトのリージョンと一致させる必要があります。リージョンが異なる場合、ネットワーク接続の問題が発生する可能性があります。
エンドポイントを指定しない場合、システムは現在のプロジェクトが存在するリージョンのエンドポイントを使用します。
この方法は推奨されません。クロスリージョンでのファイルストレージにより、ネットワーク接続の問題が発生する可能性があるためです。
Bucket name: OSS バケットの名前。
oss_endpointに従ってバケット名を指定する必要があります。例:
oss://oss-cn-beijing-internal.aliyuncs.com/your_bucket/path/。バケット名の確認方法については、「バケットの一覧表示」をご参照ください。
Directory name: OSS ディレクトリの名前。ディレクトリ名の後にファイル名を指定しないでください。
例:
oss://oss-cn-beijing-internal.aliyuncs.com/oss-mc-test/Demo1/。誤った例:
-- HTTP 接続はサポートされていません。 http://oss-cn-shanghai-internal.aliyuncs.com/oss-mc-test/Demo1/ -- HTTPS 接続はサポートされていません。 https://oss-cn-shanghai-internal.aliyuncs.com/oss-mc-test/Demo1/ -- 不正な接続アドレス。 oss://oss-cn-shanghai-internal.aliyuncs.com/Demo1 -- ファイル名を指定しないでください。 oss://oss-cn-shanghai-internal.aliyuncs.com/oss-mc-test/Demo1/vehicle.csv権限指定 (RamRole):
明示的に指定 (推奨): カスタムロールを作成し、アクセスポリシーをアタッチし、そのカスタムロールの ARN を使用します。詳細については、「STS 権限付与」をご参照ください。
デフォルトを使用 (推奨されません):
aliyunodpsdefaultroleロールの ARN を使用します。
WITH serdeproperties 属性
property_name
シナリオ
property_value
デフォルト値
odps.properties.rolearn
STS 権限付与を使用する場合にこのプロパティを追加します。
OSS へのアクセス権限を持つ RAM ロールの ARN を指定します。
ARN は、RAM コンソールのロール詳細ページから取得できます。例:
acs:ram::xxxxxx:role/aliyunodpsdefaultrole。MaxCompute と OSS の所有者が同一アカウントの場合:
テーブル作成ステートメントで
odps.properties.rolearnを指定しない場合、aliyunodpsdefaultroleロールの ARN がデフォルトで使用されます。この場合、まず STS 権限付与 を使用してaliyunodpsdefaultroleロールを作成する必要があります。カスタムロールの ARN を使用する場合、まずカスタムロールを作成する必要があります。詳細については、「OSS に対する STS 権限付与 (カスタム権限付与)」をご参照ください。
MaxCompute と OSS の所有者が異なるアカウントの場合、カスタムロールの ARN を指定する必要があります。詳細については、「OSS に対する STS 権限付与 (カスタム権限付与)」をご参照ください。
OSS からのデータ読み取り
注意事項
OSS 外部テーブルを作成後、外部テーブルを介して OSS からデータを読み取ることができます。サポートされる OSS データファイル形式および OSS 外部テーブルの作成構文については、「構文」をご参照ください。
SQL ステートメントに複雑なデータの型が含まれる場合、SQL ステートメントの前に
set odps.sql.type.system.odps2=true;コマンドを追加し、両方をまとめて送信してください。データの型の詳細については、「データの型のバージョン」をご参照ください。オープンソースデータにマッピングされた OSS 外部テーブルの場合、OSS からのデータ読み取り前にセッションレベルで
set odps.sql.hive.compatible=true;を設定してください。設定しないとエラーが報告されます。OSS は帯域幅リソースを限定的に提供しています。短時間にデータの読み取り・書き込みトラフィックがインスタンスの帯域幅制限を超えた場合、OSS 外部テーブルのデータ読み取り・書き込み速度が直接影響を受けます。OSS の帯域幅の詳細については、「使用制限およびパフォーマンスメトリクス」をご参照ください。
構文
<select_statement> FROM <from_statement>;select_statement:
SELECT句。ソーステーブルからターゲットテーブルに挿入するデータをクエリします。from_statement:
FROM句。外部テーブル名など、データソースを指定します。
非パーティション化データ
非パーティション化データ
非パーティション化 OSS 外部テーブルを作成後、OSS からデータを読み取る方法は以下のとおりです:
方法 1 (推奨): OSS からオープンソース形式のデータを MaxCompute 内部テーブルにインポートし、その後データを読み取る。
この方法は、反復的な計算が必要なシナリオや、計算パフォーマンス要件が高いシナリオに適しています。OSS 外部テーブルと同じスキーマを持つ内部テーブルを MaxCompute プロジェクト内に作成し、OSS データをこの内部テーブルにインポートした後、複雑なクエリを実行できます。これにより、MaxCompute の内部ストレージ最適化機構を十分に活用して、計算パフォーマンスを向上させることができます。次のコマンドはサンプルです:
CREATE TABLE <table_internal> LIKE <mc_oss_extable_name>; INSERT OVERWRITE TABLE <table_internal> SELECT * FROM <mc_oss_extable_name>;方法 2: OSS から直接データを読み取る。MaxCompute 内部テーブルに対する操作と同様です。
この方法は、計算パフォーマンス要件が低いシナリオに適しています。内部テーブルから読み取る場合とは異なり、各データ読み取り操作は OSS から直接対応するデータを取得します。
パーティション化データ
パーティション化データ
OSS 外部テーブルが作成されると、MaxCompute は OSS ディレクトリ内のすべてのデータ(サブディレクトリ内のデータファイルを含む)をフルスキャンします。データ量が大きい場合、フルディレクトリスキャンにより不要な I/O 消費が発生し、データ処理時間が増加する可能性があります。この問題は、以下の 2 つの方法で解決できます。
方法 1(推奨):OSS にデータを保存するには、標準パーティション化パス または カスタムパーティション化パス を使用します。
OSS 外部テーブルを作成する際、テーブル作成ステートメントでパーティションおよび oss_location 情報を指定する必要があります。OSS データの格納には、標準パーティション化パスの使用を推奨します。
方法 2: 複数のデータストレージパスを計画する。
各パスからデータを読み取るために複数の OSS 外部テーブルを作成できます。つまり、各 OSS 外部テーブルが OSS データのサブセットを指すようになります。この方法は煩雑であり、データ管理の観点からも効果的ではないため、推奨されません。
標準パーティション化パス形式
oss://<oss_endpoint>/<Bucket name>/<directory name>/<partitionKey1=value1>/<partitionKey2=value2>/...例: ある企業が、OSS 上に CSV 形式の日次ログファイルを格納し、MaxCompute を使用して毎日データを処理しています。OSS データの格納に使用する標準パーティション化パスは、以下のとおりに設定する必要があります。
oss://oss-odps-test/log_data/year=2016/month=06/day=01/logfile
oss://oss-odps-test/log_data/year=2016/month=06/day=02/logfile
oss://oss-odps-test/log_data/year=2016/month=07/day=10/logfile
oss://oss-odps-test/log_data/year=2016/month=08/day=08/logfile
...カスタムパーティション化パス形式
カスタムパーティション化パス形式には、パーティション列名ではなくパーティション列値のみが含まれます。例:
oss://oss-odps-test/log_data_customized/2016/06/01/logfile
oss://oss-odps-test/log_data_customized/2016/06/02/logfile
oss://oss-odps-test/log_data_customized/2016/07/10/logfile
oss://oss-odps-test/log_data_customized/2016/08/08/logfile
...OSS 上のデータがパーティション化されていても、パスが標準パーティション化パス形式でない場合、MaxCompute では、異なるサブディレクトリを異なるパーティションにバインドすることで、サブディレクトリ内のデータにアクセスできます。
解決策: OSS 外部テーブルを作成後、alter table ... add partition ... location ... コマンドを使用してサブディレクトリを指定し、異なるサブディレクトリを異なるパーティションにバインドします。次のコマンドはサンプルです。
ALTER TABLE log_table_external ADD PARTITION (year = '2016', month = '06', day = '01')
location 'oss://oss-cn-hangzhou-internal.aliyuncs.com/bucket_name/oss-odps-test/log_data_customized/2016/06/01/';
ALTER TABLE log_table_external ADD PARTITION (year = '2016', month = '06', day = '02')
location 'oss://oss-cn-hangzhou-internal.aliyuncs.com/bucket_name/oss-odps-test/log_data_customized/2016/06/02/';
ALTER TABLE log_table_external ADD PARTITION (year = '2016', month = '07', day = '10')
location 'oss://oss-cn-hangzhou-internal.aliyuncs.com/bucket_name/oss-odps-test/log_data_customized/2016/07/10/';
ALTER TABLE log_table_external ADD PARTITION (year = '2016', month = '08', day = '08')
location 'oss://oss-cn-hangzhou-internal.aliyuncs.com/bucket_name/oss-odps-test/log_data_customized/2016/08/08/';クエリ最適化
動的統計コレクション
動的統計コレクション
データは外部データレイクに格納されており、事前の統計情報がないため、クエリ オプティマイザーは保守的な戦略を採用し、クエリ効率が低下します。動的統計コレクション機能により、オプティマイザーはクエリ実行中に一時的にテーブル統計情報を収集して小規模テーブルを特定できます。その後、Hash Join や結合順序の最適化、シャッフルの削減、実行パイプラインの短縮などの手法を積極的に活用して、クエリを最適化します。
以下のパラメーターは、Paimon、Hudi、Delta Lake の外部テーブルには適用されません。
SET odps.meta.exttable.stats.onlinecollect=true;
SELECT * FROM <tablename>;外部テーブル分割最適化
外部テーブル分割最適化
分割サイズパラメーターを設定することで、単一の同時実行タスクが処理するデータ量を調整し、クエリ効率を最適化できます。分割サイズの設定には以下の効果があります。
テーブルのデータ量が非常に大きく、1 回の読み取り量が小さすぎる場合、分割数が過剰になり、並列度が高くなりすぎます。その結果、インスタンスは大部分の時間をリソース待ちに費やすことになります。
テーブルのデータ量が非常に小さく、1 回の読み取り量が大きすぎる場合、分割数が不足し、同時実行数が不十分になります。その結果、ほとんどのリソースがアイドル状態になります。
-- 次のいずれかのパラメーターを使用できます。
-- 単位: MiB。デフォルト値: 256 MiB。内部テーブルおよび外部テーブルの両方に適用されます。
SET odps.stage.mapper.split.size=<value>;
SELECT * FROM <tablename>;
-- 単位: MiB。デフォルト値: 256 MiB。外部テーブルにのみ適用されます。
SET odps.sql.unstructured.data.split.size=<value>;
SELECT * FROM <tablename>;DOP 制御
DOP を使用した並列処理の制御
odps.sql.split.dop パラメーターを設定することで、データ読み取り時の並列処理の次数を調整できます。このパラメーターは odps.sql.mapper.split.size より優先度が高くなります。
dop 値が OSS ディレクトリ内のファイル数より多い場合、実際の同時実行数は設定した dop 値と大きく異なる可能性があります。
dop 値が小さすぎる場合、設定は無効になります。
odps.input.file.num.limitパラメーターを使用して、単一インスタンスが処理できる最大ファイル数を変更してください。
構文
-- 2 レイヤーモデルの構文: set odps.sql.split.dop={"project.table": xxx};
-- 3 レイヤーモデルの構文: set odps.sql.split.dop={"project.schema.table": xxx};
SET odps.sql.split.dop={
"project.schema.table1": xxx,
"project.schema.table2": yyy
};
SET odps.sql.common.table.planner.ext.hive.bridge=FALSE;
SELECT * FROM <your_table>;
使用例
多数の小規模ファイルによる DOP 歪みの問題と解決策
MaxCompute では、単一インスタンスが処理できるファイル数の上限が 240 個に設定されています。OSS 外部テーブルのディレクトリに 3,449 個のファイルが存在する場合、最小並列処理の次数は 3,449 / 240 ≈ 15 になります。DOP を 15 より小さい値に設定した場合、設定は無視されます。
これを解決するには、odps.input.file.num.limit を設定して、単一インスタンスが処理できる最大ファイル数を変更します。
SET odps.sql.split.dop = {"lakehouse47_3.tpch_1t_parquet_snappy.lineitem": 2};
SET odps.input.file.num.limit = 5000;単一インスタンスが処理できる OSS ファイル数の上限は 5,000 個になります。lineitem テーブルのファイル数はこの上限を大幅に下回っているため、実際の並列処理の次数は設定した DOP 値と一致します。
OSS へのデータ書き込み
OSS からのデータ読み取りと同様に、MaxCompute を使用すると、内部テーブルまたは外部テーブルから処理されたデータを OSS に書き込むことができます。制限事項の詳細については、「適用範囲」をご参照ください。
組み込みテキストまたはオープンソースデータパーサーを使用した OSS へのデータ書き込み: 組み込みテキストパーサー、組み込みオープンソースパーサー。
カスタムパーサーを使用した OSS へのデータ書き込み: カスタムパーサーを使用した OSS 外部テーブルの作成の例。
OSS マルチパートアップロード機能を使用した OSS へのデータ書き込み: OSS マルチパートアップロード機能を使用した OSS へのデータ書き込み。
構文
INSERT {INTO|OVERWRITE} TABLE <table_name> PARTITION (<ptcol_name>[, <ptcol_name> ...])
<select_statement> FROM <from_statement>;パラメーター | 必須 | 説明 |
table_name | はい | 書き込み先の外部テーブルの名前。 |
select_statement | はい |
|
from_statement | はい |
|
動的パーティションへのデータ挿入については、「動的パーティションへのデータの挿入または上書き (DYNAMIC PARTITION)」をご参照ください。
注意事項
INSERT OVERWRITE ... SELECT ... FROM ...;操作がソーステーブル from_tablename に 1,000 個のマッパーを割り当てる場合、1,000 個の TSV または CSV ファイルが生成されます。生成されるファイル数は、MaxCompute が提供する設定を使用して制御できます。
出力がマッパー内にある場合:
odps.stage.mapper.split.sizeを使用して同時実行マッパー数を制御し、生成されるファイル数を調整します。出力がリデューサーまたはジョイナー内にある場合:
odps.stage.reducer.numおよびodps.stage.joiner.numをそれぞれ使用して、生成されるファイル数を調整します。
不整合書き込みのリスク: OSS 外部テーブルに対して INSERT OVERWRITE ステートメントを使用する場合、または UNLOAD コマンドを使用して OSS にファイルをエクスポートする場合、指定された OSS ロケーションのサブディレクトリまたはパーティションに対応するロケーション内のデータが、新しいデータの書き込み前に削除されます。このロケーションディレクトリに、他の外部エンジンによって OSS に直接書き込まれた重要なデータが存在する場合、そのデータも新しいデータの書き込み前に削除されます。したがって、外部テーブルのロケーションディレクトリ内の既存ファイルはバックアップしておくか、UNLOAD ディレクトリは空にしておく必要があります。その他の不整合書き込みのリスクについては、「適用範囲」をご参照ください。
OSS マルチパートアップロード機能を使用した OSS へのデータ書き込み
OSS にオープンソース形式のデータを書き込む必要がある場合、オープンソースデータパーサーを使用して作成した OSS 外部テーブルと OSS のマルチパートアップロード 機能を併用して、INSERT 操作を実行し、OSS にデータを書き込むことができます。
OSS マルチパートアップロード機能を有効にするには、以下の設定を行います:
シナリオ | コマンド |
プロジェクトレベルで設定 | プロジェクト全体に適用されます。 |
セッションレベルで設定 | 現在のタスクにのみ適用されます。 |
odps.sql.unstructured.oss.commit.mode プロパティのデフォルト値は false です。各値の実装原理は以下のとおりです:
値 | 原理 |
false | MaxCompute が OSS 外部テーブルに書き込むデータは、LOCATION ディレクトリ内の .odps フォルダに格納されます。.odps フォルダには、MaxCompute のデータ整合性を保証するための .meta ファイルが含まれています。.odps の内容は MaxCompute のみが正しく処理できます。他のデータ処理エンジンでは正しく解析できない可能性があり、エラーが発生する場合があります。 |
true | MaxCompute は、他のデータ処理エンジンとの互換性を確保するためにマルチパートアップロード機能を使用します。 |
エクスポートされたファイルの管理
パラメーター
OSS に書き込まれるデータファイルにプレフィックス、サフィックス、または拡張子を追加する必要がある場合、以下のパラメーターを使用できます。
property_name | シナリオ | 説明 | property_value | デフォルト値 |
odps.external.data.output.prefix (odps.external.data.prefix との互換性あり) | 出力ファイルにカスタムプレフィックスを追加する必要がある場合にこのプロパティを追加します。 |
| 許可された文字の組み合わせ (例: 'mc_') | なし |
odps.external.data.enable.extension | 出力ファイルの拡張子を表示する必要がある場合にこのプロパティを追加します。 | True の場合、出力ファイルの拡張子が表示されます。False の場合、表示されません。 |
| False |
odps.external.data.output.suffix | 出力ファイルにカスタムサフィックスを追加する必要がある場合にこのプロパティを追加します。 | 英字、数字、アンダースコア (a-z、A-Z、0-9、_) のみを含む。 | 許可された文字の組み合わせ (例: '_hangzhou') | なし |
odps.external.data.output.explicit.extension | 出力ファイルにカスタム拡張子を追加する必要がある場合にこのプロパティを追加します。 |
| 許可された文字の組み合わせ (例: "jsonl") | なし |
例
OSS に書き込まれるファイルのカスタムプレフィックスを
test06_に設定します。DDL は以下のとおりです:CREATE EXTERNAL TABLE <mc_oss_extable_name> ( vehicleId INT, recordId INT, patientId INT, calls INT, locationLatitute DOUBLE, locationLongitude DOUBLE, recordTime STRING, direction STRING ) ROW FORMAT SERDE 'org.apache.hive.hcatalog.data.JsonSerDe' WITH serdeproperties ( 'odps.properties.rolearn'='acs:ram::<uid>:role/aliyunodpsdefaultrole' ) STORED AS textfile LOCATION 'oss://oss-cn-beijing-internal.aliyuncs.com/***/' TBLPROPERTIES ( -- カスタムプレフィックスを追加します。 'odps.external.data.output.prefix'='test06_') ; -- 外部テーブルにデータを書き込みます。 INSERT INTO <mc_oss_extable_name> VALUES (1,32,76,1,63.32106,-92.08174,'9/14/2014 0:10','NW');書き込み操作後に生成されるファイルを示す図を以下に示します。

OSS に書き込まれるファイルのカスタムサフィックスを
_beijingに設定する場合、DDL は以下のとおりです:CREATE EXTERNAL TABLE <mc_oss_extable_name> ( vehicleId INT, recordId INT, patientId INT, calls INT, locationLatitute DOUBLE, locationLongitude DOUBLE, recordTime STRING, direction STRING ) ROW FORMAT SERDE 'org.apache.hive.hcatalog.data.JsonSerDe' WITH serdeproperties ( 'odps.properties.rolearn'='acs:ram::<uid>:role/aliyunodpsdefaultrole' ) STORED AS textfile LOCATION 'oss://oss-cn-beijing-internal.aliyuncs.com/***/' TBLPROPERTIES ( -- カスタムサフィックスを追加します。 'odps.external.data.output.suffix'='_beijing') ; -- 外部テーブルにデータを書き込みます。 INSERT INTO <mc_oss_extable_name> VALUES (1,32,76,1,63.32106,-92.08174,'9/14/2014 0:10','NW');書き込み操作後に生成されるファイルを示す図を以下に示します。

出力ファイルに自動的にファイル拡張子を生成する場合、以下の DDL を使用します:
CREATE EXTERNAL TABLE <mc_oss_extable_name> ( vehicleId INT, recordId INT, patientId INT, calls INT, locationLatitute DOUBLE, locationLongitude DOUBLE, recordTime STRING, direction STRING ) ROW FORMAT SERDE 'org.apache.hive.hcatalog.data.JsonSerDe' WITH serdeproperties ( 'odps.properties.rolearn'='acs:ram::<uid>:role/aliyunodpsdefaultrole' ) STORED AS textfile LOCATION 'oss://oss-cn-beijing-internal.aliyuncs.com/***/' TBLPROPERTIES ( -- ファイル拡張子を自動的に生成します。 'odps.external.data.enable.extension'='true') ; -- 外部テーブルにデータを書き込みます。 INSERT INTO <mc_oss_extable_name> VALUES (1,32,76,1,63.32106,-92.08174,'9/14/2014 0:10','NW');書き込み操作後に生成されるファイルを示す図を以下に示します。
OSS に書き込まれるファイルのカスタムファイル拡張子を
jsonlに設定する場合、DDL は以下のとおりです:CREATE EXTERNAL TABLE <mc_oss_extable_name> ( vehicleId INT, recordId INT, patientId INT, calls INT, locationLatitute DOUBLE, locationLongitude DOUBLE, recordTime STRING, direction STRING ) ROW FORMAT SERDE 'org.apache.hive.hcatalog.data.JsonSerDe' WITH serdeproperties ( 'odps.properties.rolearn'='acs:ram::<uid>:role/aliyunodpsdefaultrole' ) STORED AS textfile LOCATION 'oss://oss-cn-beijing-internal.aliyuncs.com/***/' TBLPROPERTIES ( -- カスタムファイル拡張子を追加します。 'odps.external.data.output.explicit.extension'='jsonl') ; -- 外部テーブルにデータを書き込みます。 INSERT INTO <mc_oss_extable_name> VALUES (1,32,76,1,63.32106,-92.08174,'9/14/2014 0:10','NW');書き込み操作後に生成されるファイルを示す図を以下に示します。

OSS に書き込まれるファイルのプレフィックスを
mc_、サフィックスを_beijing、ファイル拡張子をjsonlに設定します。DDL は以下のとおりです:CREATE EXTERNAL TABLE <mc_oss_extable_name> ( vehicleId INT, recordId INT, patientId INT, calls INT, locationLatitute DOUBLE, locationLongitude DOUBLE, recordTime STRING, direction STRING ) ROW FORMAT SERDE 'org.apache.hive.hcatalog.data.JsonSerDe' WITH serdeproperties ( 'odps.properties.rolearn'='acs:ram::<uid>:role/aliyunodpsdefaultrole' ) STORED AS textfile LOCATION 'oss://oss-cn-beijing-internal.aliyuncs.com/***/' TBLPROPERTIES ( -- カスタムプレフィックスを追加します。 'odps.external.data.output.prefix'='mc_', -- カスタムサフィックスを追加します。 'odps.external.data.output.suffix'='_beijing', -- カスタムファイル拡張子を追加します。 'odps.external.data.output.explicit.extension'='jsonl') ; -- 外部テーブルにデータを書き込みます。 INSERT INTO <mc_oss_extable_name> VALUES (1,32,76,1,63.32106,-92.08174,'9/14/2014 0:10','NW');書き込み操作後に生成されるファイルを示す図を以下に示します。

動的パーティションを使用した大規模ファイルの書き込み
ビジネスシナリオ
先祖テーブルの計算結果をパーティション形式で OSS にエクスポートし、大規模ファイル (例: 4 GB) として書き込むことができます。これは、odps.adaptive.shuffle.desired.partition.size パラメーター (MB 単位) を動的パーティション形式で設定することで実現できます。
利点: パラメーター値を設定することで、望ましい出力ファイルサイズを制御できます。
欠点: 大規模ファイルの書き込みにより並列度が低下し、実行時間が長くなるため、全体の実行時間が長くなります。
メトリクスの説明
-- service.mode を無効化します。
SET odps.service.mode=off;
-- 動的パーティション機能を有効化します。
SET odps.sql.reshuffle.dynamicpt=true;
-- 各リデューサーの望ましいデータ消費量を設定します。各ファイルを 4 GB にしたい場合:
SET odps.adaptive.shuffle.desired.partition.size=4096; 例
OSS に約 4 GB の JSON ファイルを書き込みます。
テストデータを準備します。パブリックデータセットテーブル
bigdata_public_dataset.tpcds_1t.web_sales(約 30 GB) を使用します。データは MaxCompute 上で圧縮形式で保存されているため、エクスポート後にサイズが増加します。JSON 外部テーブルを作成します。
-- サンプルテーブル名: json_ext_web_sales CREATE EXTERNAL TABLE json_ext_web_sales( c_int INT , c_string STRING ) PARTITIONED BY (pt STRING) ROW FORMAT SERDE 'org.apache.hive.hcatalog.data.JsonSerDe' WITH serdeproperties ( 'odps.properties.rolearn'='acs:ram::<uid>:role/aliyunodpsdefaultrole' ) STORED AS textfile LOCATION 'oss://oss-cn-hangzhou-internal.aliyuncs.com/oss-mc-test/demo-test/';パラメーターを設定せずに、テストテーブルを動的パーティション形式で JSON 外部テーブルに書き込みます。
-- service.mode を無効化します。 set odps.service.mode=off; -- レイヤー 3 構文スイッチを有効化します。 SET odps.namespace.schema=true; -- 動的パーティション形式で JSON 外部テーブルに書き込みます。 INSERT OVERWRITE json_ext_web_sales PARTITION(pt) SELECT CAST(ws_item_sk AS INT) AS c_int, CAST(ws_bill_customer_sk AS string) AS c_string , COALESCE(CONCAT(ws_bill_addr_sk %2, '_', ws_promo_sk %3),'null_pt') AS pt FROM bigdata_public_dataset.tpcds_1t.web_sales;OSS 上に保存されたファイルを以下に示します:

大規模ファイル出力のために
odps.adaptive.shuffle.desired.partition.sizeパラメーターを追加し、テストテーブルを動的パーティション形式で JSON 外部テーブルに書き込みます。-- service.mode を無効化します。 SET odps.service.mode=off; -- レイヤー 3 構文スイッチを有効化します。 SET odps.namespace.schema=true; -- 動的パーティション機能を有効化します。 SET odps.sql.reshuffle.dynamicpt=true; -- 各リデューサーの望ましいデータ消費量を設定します。各ファイルを 4 GB にしたい場合: SET odps.adaptive.shuffle.desired.partition.size=4096; -- 動的パーティション形式で JSON 外部テーブルに書き込みます。 INSERT OVERWRITE json_ext_web_sales PARTITION(pt) SELECT CAST(ws_item_sk AS INT) AS c_int, CAST(ws_bill_customer_sk AS string) AS c_string , COALESCE(CONCAT(ws_bill_addr_sk %2, '_', ws_promo_sk %3),'null_pt') AS pt FROM bigdata_public_dataset.tpcds_1t.web_sales;OSS 上に保存されたファイルを以下に示します:

OSS 外部テーブルのパーティション操作
OSS 外部テーブルはパーティション操作をサポートしています。詳細については、「OSS 外部テーブルのパーティション操作」および「内部テーブルのパーティション操作」をご参照ください。以下の表にサポートされる操作を示します。
操作 | サポート |
パーティションの追加 | |
パーティション更新時刻の変更 | |
パーティション値の変更 | |
パーティションのマージ | |
パーティションの一覧表示 | |
パーティション情報の表示 | |
パーティションの削除 | |
パーティションのトランケート |
OSS からのインポートおよび OSS へのエクスポート
LOAD コマンド: OSS などの外部ストレージから MaxCompute テーブルまたはパーティションにデータをインポートします。
UNLOAD コマンド: MaxCompute プロジェクトから OSS などの外部ストレージにデータをエクスポートし、他のコンピュートエンジンで使用します。
付録: サンプルデータの準備
OSS ディレクトリの準備
提供されるサンプルデータ情報は以下のとおりです:
oss_endpoint:
oss-cn-hangzhou-internal.aliyuncs.com(中国 (杭州))。Bucket name:
oss-mc-test。Directory names:
Demo1/、Demo2/、Demo3/、およびSampleData/。
非パーティション化テーブルデータ
Demo1/ディレクトリにアップロードされたファイルは vehicle.csv で、以下のデータを含んでいます。Demo1/ディレクトリは、組み込みテキストデータパーサーを使用して作成された非パーティション化テーブルにマッピングされます。1,1,51,1,46.81006,-92.08174,9/14/2014 0:00,S 1,2,13,1,46.81006,-92.08174,9/14/2014 0:00,NE 1,3,48,1,46.81006,-92.08174,9/14/2014 0:00,NE 1,4,30,1,46.81006,-92.08174,9/14/2014 0:00,W 1,5,47,1,46.81006,-92.08174,9/14/2014 0:00,S 1,6,9,1,46.81006,-92.08174,9/15/2014 0:00,S 1,7,53,1,46.81006,-92.08174,9/15/2014 0:00,N 1,8,63,1,46.81006,-92.08174,9/15/2014 0:00,SW 1,9,4,1,46.81006,-92.08174,9/15/2014 0:00,NE 1,10,31,1,46.81006,-92.08174,9/15/2014 0:00,Nパーティション化テーブルデータ
Demo2/ディレクトリには、direction=N/、direction=NE/、direction=S/、direction=SW/、およびdirection=W/の 5 つのサブディレクトリが含まれています。アップロードされたファイルは、それぞれ vehicle1.csv、vehicle2.csv、vehicle3.csv、vehicle4.csv、vehicle5.csv で、以下のデータを含んでいます。Demo2/ディレクトリは、組み込みテキストデータパーサーを使用して作成されたパーティションテーブルにマッピングされます。--vehicle1.csv 1,7,53,1,46.81006,-92.08174,9/15/2014 0:00 1,10,31,1,46.81006,-92.08174,9/15/2014 0:00 --vehicle2.csv 1,2,13,1,46.81006,-92.08174,9/14/2014 0:00 1,3,48,1,46.81006,-92.08174,9/14/2014 0:00 1,9,4,1,46.81006,-92.08174,9/15/2014 0:00 --vehicle3.csv 1,6,9,1,46.81006,-92.08174,9/15/2014 0:00 1,5,47,1,46.81006,-92.08174,9/14/2014 0:00 1,6,9,1,46.81006,-92.08174,9/15/2014 0:00 --vehicle4.csv 1,8,63,1,46.81006,-92.08174,9/15/2014 0:00 --vehicle5.csv 1,4,30,1,46.81006,-92.08174,9/14/2014 0:00圧縮データ
Demo3/ディレクトリにアップロードされたファイルは vehicle.csv.gz です。圧縮パッケージ内のファイル vehicle.csv は、Demo1/ディレクトリ内のファイルと同じ内容です。これは、圧縮プロパティを持つ OSS 外部テーブルにマッピングするために使用されます。カスタムパーサーのデータ
SampleData/ディレクトリにアップロードされたファイルは vehicle6.csv で、以下のデータを含んでいます。SampleData/ディレクトリは、オープンソースデータパーサーを使用して作成された OSS 外部テーブルにマッピングされます。1|1|51|1|46.81006|-92.08174|9/14/2014 0:00|S 1|2|13|1|46.81006|-92.08174|9/14/2014 0:00|NE 1|3|48|1|46.81006|-92.08174|9/14/2014 0:00|NE 1|4|30|1|46.81006|-92.08174|9/14/2014 0:00|W 1|5|47|1|46.81006|-92.08174|9/14/2014 0:00|S 1|6|9|1|46.81006|-92.08174|9/14/2014 0:00|S 1|7|53|1|46.81006|-92.08174|9/14/2014 0:00|N 1|8|63|1|46.81006|-92.08174|9/14/2014 0:00|SW 1|9|4|1|46.81006|-92.08174|9/14/2014 0:00|NE 1|10|31|1|46.81006|-92.08174|9/14/2014 0:00|N
OSS 外部テーブルのよくある質問
外部テーブルを使用して OSS データを処理する際に、「Inline data exceeds the maximum allowed size」エラーが発生した場合の対処方法を教えてください。
OSS 外部テーブルからデータを読み取る際に「Couldn't connect to server」エラーが発生した場合の対処方法を教えてください。
OSS 外部テーブルを作成する際に「Network is unreachable (connect failed)」エラーが発生した場合の対処方法を教えてください。
OSS マルチパートアップロード機能を使用した場合、古いデータが削除されても新しいデータが書き込まれないという問題の対処方法を教えてください。
Spark から OSS 外部テーブルにアクセスした際に「table not found」エラーが発生した場合の対処方法を教えてください。
外部テーブルを使用して OSS データを処理する際に、「Inline data exceeds the maximum allowed size」エラーが発生した場合の対処方法を教えてください。
問題
OSS データを処理する際に、
Inline data exceeds the maximum allowed sizeエラーが報告されます。原因
OSS Store では、各小規模ファイルにサイズ制限があります。ファイルサイズが 3 GB を超えるとエラーが報告されます。
解決策
この問題を解決するには、以下の 2 つのプロパティを調整できます。原則として、プロパティ値を変更して実行計画を調整し、各リデューサーが OSS 外部テーブルに書き込むデータ量を制御します。これにより、OSS Store ファイルが 3 GB の制限を超えないようにします。
set odps.sql.mapper.split.size=256; # 各マッパーが読み取るデータ量を MB 単位で調整します。 set odps.stage.reducer.num=100; # リデュース段階におけるワーカー数を調整します。
MaxCompute で OSS 外部テーブルにアクセスする UDF をアップロードしたところ、ローカルテストでは成功しましたが、実行時にメモリオーバーフローのエラーが発生しました。この問題の対処方法を教えてください。
問題
MaxCompute で OSS 外部テーブルにアクセスする UDF をアップロードしたところ、ローカルテストでは成功しましたが、実行時に以下のエラーが報告されました。
FAILED: ODPS-0123131:User defined function exception - Traceback: java.lang.OutOfMemoryError: Java heap space以下のパラメーターを設定したところ、実行時間は延長されましたが、エラーは継続しました。
set odps.stage.mapper.mem = 2048; set odps.stage.mapper.jvm.mem = 4096;原因
外部テーブルにオブジェクトファイルが多すぎてメモリ使用量が過剰になり、パーティションが設定されていないことが原因です。
解決策
クエリに使用するデータ量を減らします。
オブジェクトファイルをパーティション化して、メモリ使用量を削減します。
OSS 外部テーブルを使用して複数の小規模ファイルを 1 つのファイルにマージする方法を教えてください。
Logview のログを確認し、SQL 実行計画の最終ステージがリデューサーまたはジョイナーであるかどうかを確認します。
リデューサーである場合、
set odps.stage.reducer.num=1;ステートメントを実行します。ジョイナーである場合、
set odps.stage.joiner.num=1;ステートメントを実行します。
OSS 外部テーブルからデータを読み取る際に「Couldn't connect to server」エラーが発生した場合の対処方法を教えてください。
問題
OSS 外部テーブルからデータを読み取る際に、以下のエラーが報告されます。
ODPS-0123131:User defined function exception - common/io/oss/oss_client.cpp(95): OSSRequestException: req_id: , http status code: -998, error code: HttpIoError, message: Couldn't connect to server原因
原因 1: OSS 外部テーブルの作成時に、oss_location アドレス内の
oss_endpointにパブリックエンドポイントが使用され、内部エンドポイントが使用されていませんでした。原因 2: OSS 外部テーブルの作成時に、oss_location アドレス内の
oss_endpointに別のリージョンのエンドポイントが使用されていました。
解決策
原因 1 の場合:
OSS 外部テーブル作成ステートメントの oss_location パラメーター内の
oss_endpointが内部エンドポイントであるかどうかを確認してください。パブリックエンドポイントの場合は、内部エンドポイントに変更してください。パラメーターの詳細については、「パラメーター」をご参照ください。たとえば、インドネシア (ジャカルタ) リージョンのユーザーが
oss://oss-ap-southeast-5.aliyuncs.com/<bucket>/....のアドレスを使用して外部テーブルを作成した場合、対応する内部アドレスoss://oss-ap-southeast-5-internal.aliyuncs.com/<bucket>/....に変更する必要があります。原因 2 の場合:
OSS 外部テーブル作成ステートメントの oss_location パラメーター内の
oss_endpointが、アクセスしようとするリージョンのエンドポイントであるかどうかを確認してください。OSS クラシックネットワークドメイン名の詳細については、「リージョンとエンドポイント」をご参照ください。
OSS 外部テーブルを作成する際に「Network is unreachable (connect failed)」エラーが発生した場合の対処方法を教えてください。
問題
OSS 外部テーブルを作成する際に、以下のエラーが報告されます。
ODPS-0130071:[1,1] Semantic analysis exception - external table checking failure, error message: Cannot connect to the endpoint 'oss-cn-beijing.aliyuncs.com': Connect to bucket.oss-cn-beijing.aliyuncs.com:80 [bucket.oss-cn-beijing.aliyuncs.com] failed: Network is unreachable (connect failed)原因
OSS 外部テーブルの作成時に、oss_location アドレス内の
oss_endpointにパブリックエンドポイントが使用され、内部エンドポイントが使用されていませんでした。解決策
OSS 外部テーブル作成ステートメントの oss_location パラメーター内の
oss_endpointが内部エンドポイントであるかどうかを確認してください。パブリックエンドポイントの場合は、内部エンドポイントに変更してください。パラメーターの詳細については、「パラメーター」をご参照ください。たとえば、中国 (北京) リージョンのユーザーが
oss://oss-cn-beijing.aliyuncs.com/<bucket>/....のアドレスを使用して外部テーブルを作成した場合、対応する内部アドレスoss://oss-cn-beijing-internal.aliyuncs.com/<bucket>/....に変更する必要があります。
OSS 外部テーブルで SQL ジョブの実行が遅い場合の対処方法を教えてください。
OSS 外部テーブルの GZ 圧縮ファイルの読み取りが遅い
症状
ユーザーが、OSS 上の 200 GB の GZ 圧縮ファイルをデータソースとして OSS 外部テーブルを作成しました。データ読み取りプロセスが遅いです。
原因
マップ段階で実行されるマッパー数が少なすぎるため、SQL 処理速度が遅くなっています。
解決策
構造化データの場合、以下のパラメーターを設定して、単一のマッパーが読み取るデータ量を調整し、SQL 実行を高速化できます。
set odps.sql.mapper.split.size=256; # 各マッパーが読み取るテーブルデータ量を MB 単位で調整します。非構造化データの場合、OSS 外部テーブルのパスに OSS ファイルが 1 つしかないかどうかを確認します。1 つしかない場合、圧縮された非構造化データは分割できないため、1 つのマッパーしか生成されず、処理速度が遅くなります。この場合、対応する外部テーブルパス上の OSS で大規模ファイルを小規模ファイルに分割することを推奨します。これにより、外部テーブルを読み取るときに生成されるマッパー数が増加し、読み取り速度が向上します。
SDK を使用した MaxCompute 外部テーブルデータの検索が遅い
症状
SDK を使用して MaxCompute 外部テーブルデータを検索すると、処理が遅いです。
解決策
外部テーブルは全表スキャンのみをサポートしており、処理が遅くなります。代わりに MaxCompute 内部テーブルの使用を推奨します。
OSS マルチパートアップロード機能を使用した場合、古いデータが削除されても新しいデータが書き込まれないという問題の対処方法を教えてください。
問題
insert overwriteシナリオにおいて、極端なケースでジョブが失敗した場合、期待通りでない結果になることがあります。古いデータが削除されますが、新しいデータは書き込まれません。原因
ハードウェア障害またはメタデータ更新失敗の非常に低い確率により、新しく書き込まれるデータがターゲットテーブルに書き込まれませんでした。OSS の削除操作はロールバックをサポートしていないため、削除された古いデータは復元できません。
解決策
OSS 外部テーブルをその古いデータに基づいて上書きする場合 (例:
insert overwrite table T select * from table T;)、事前に OSS データをバックアップしてください。ジョブが失敗した場合、バックアップした古いデータに基づいて OSS 外部テーブルを上書きできます。insert overwriteジョブを再送信できる場合、失敗した場合に単にジョブを再送信してください。
Spark から OSS 外部テーブルにアクセスした際に「table not found」エラーが発生した場合の解決策
問題
Spark を使用して OSS 外部テーブルにアクセスした際に、タスクが「table not found」エラーで失敗しました。
解決策
以下のパラメーターを追加してください:
外部テーブル構成を有効化:
spark.sql.catalog.odps.enableExternalTable=true;OSS のリージョンを構成:
spark.hadoop.odps.oss.region.default=cn-<region>
上記のパラメーターを追加した後もエラーが継続する場合:

OSS 外部テーブルを再作成し、再度アクセスしてください。
参考
サポートされる OSS 外部テーブル形式:
カスタムパーサーを使用した OSS 外部テーブルの作成および OSS への読み取り・書き込み: カスタムパーサー。
スキーマ付きデータセットとして OSS ファイルを解析し、列のフィルターおよび処理をサポート: 特別機能: スキーマレスクエリ。