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) が含まれている場合、単一の SQL 文を使用して外部テーブルの読み取りと書き込み、および UDF の実行ができます。手動でディレクトリを作成する従来の方法もサポートされています。
MaxCompute は一部のリージョンにのみデプロイされているため、リージョン間のネットワーク接続に問題が発生する可能性があります。バケットは 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 への書き込みでサポートされているデータファイル形式:
|
組み込みオープンソースデータパーサーを使用した外部テーブルの作成
構文 | データファイル形式 | 例 |
| 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 プロジェクトのリージョンと同じにしてください。異なるリージョンにある場合、ネットワーク接続の問題が発生する可能性があります。
エンドポイントを指定しない場合、システムは現在のプロジェクトが配置されているリージョンのエンドポイントを使用します。
この方法は、リージョンをまたいだファイルストレージがネットワーク接続の問題を引き起こす可能性があるため、推奨されません。
バケット名:OSS バケットの名前。バケット名は
oss_endpointの後に続く必要があります。例:
oss://oss-cn-beijing-internal.aliyuncs.com/your_bucket/path/。バケット名の表示方法については、「バケットのリスト表示」をご参照ください。
ディレクトリ名: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 を指定します。
RAM コンソールのロール詳細から ARN を取得します。例:
acs:ram::xxxxxx:role/aliyunodpsdefaultrole。MaxCompute と OSS のオーナーが同じアカウントの場合:
テーブル作成ステートメントで
odps.properties.rolearnを指定しない場合、デフォルトでaliyunodpsdefaultroleロールの ARN が使用されます。まず、STS 認証を使用してaliyunodpsdefaultroleロールを作成する必要があります。カスタムロールの ARN を使用するには、まずカスタムロールを作成する必要があります。詳細については、「OSS の STS 認証 (カスタム認証)」をご参照ください。
MaxCompute と OSS のオーナーが異なるアカウントの場合、カスタムロールの ARN を指定する必要があります。詳細については、「OSS の STS 認証 (カスタム認証)」をご参照ください。
OSS 外部テーブルへのパーティションの追加
パーティション化された OSS 外部テーブルを作成した場合、パーティションデータをインポートするための追加操作を実行する必要があります。
方法 1 (推奨):OSS ディレクトリ構造を自動的に解析して、OSS 外部テーブルにパーティションを識別して追加する。
この方法は、不足しているすべての履歴パーティションを一度に追加する必要があるシナリオに適しています。MaxCompute は、テーブル作成時に指定したパーティションディレクトリに基づいて、OSS 外部テーブルのパーティションを自動的に追加します。パーティション列名と値で一つずつ追加する必要はありません。
MSCK REPAIR TABLE <mc_oss_extable_name> ADD PARTITIONS [ WITH properties (key:VALUE, key: VALUE ...)];この方法は、増分データの追加には適していません。特に、OSS ディレクトリに 1,000 を超えるような多数のパーティションが含まれている場合には不向きです。新しいパーティションの数が既存のパーティションの数よりもはるかに少ない場合、
msckコマンドを頻繁に実行すると、OSS ディレクトリの繰り返しスキャンとメタデータ更新が多数発生します。これにより、コマンドの実行効率が低下します。増分パーティションを更新する必要があるシナリオでは、方法 2 を使用してください。方法 2:手動でコマンドを実行して、OSS 外部テーブルにパーティション情報を追加する。
この方法は、履歴パーティションが作成済みで、新しいパーティションを頻繁かつ定期的に追加する必要があるシナリオに適しています。データ書き込みタスクが実行される前にパーティションを作成する必要があります。新しいデータが OSS に書き込まれた場合でも、対応するパーティションをリフレッシュする必要はありません。外部テーブルは OSS ディレクトリから最新のデータを読み取ることができます。
ALTER TABLE <mc_oss_extable_name> ADD PARTITION (<col_name>=<col_value>)[ ADD PARTITION (<col_name>=<col_value>)...][location URL];col_name と col_value の値は、パーティションデータファイルが配置されているディレクトリ名と一致する必要があります。
パーティションデータファイルの OSS ディレクトリ構造が次の図のようになっていると仮定します。col_name は
directionに対応し、col_value はN, NE, S, SW, Wに対応します。1 つのadd partition句は 1 つのサブディレクトリに対応します。複数の OSS サブディレクトリに対しては、複数のadd partition句を使用する必要があります。
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 内部テーブルにインポートし、その後データを読み取る。
この方法は、繰り返し計算が必要なシナリオや、コンピューティングパフォーマンスに対する要件が高いシナリオに適しています。MaxCompute プロジェクトに OSS 外部テーブルと同じスキーマを持つ内部テーブルを作成することで、OSS データをこの内部テーブルにインポートし、その後複雑なクエリを実行できます。このアプローチは、MaxCompute の内部ストレージに対する最適化メカニズムを最大限に活用して、コンピューティングパフォーマンスを向上させます。以下はサンプルコマンドです。
CREATE TABLE <table_internal> LIKE <mc_oss_extable_name>; INSERT OVERWRITE TABLE <table_internal> SELECT * FROM <mc_oss_extable_name>;方法 2:MaxCompute 内部テーブルの操作と同様に、OSS から直接データを読み取る。
この方法は、コンピューティングパフォーマンスに対する要件が低いシナリオに適しています。内部テーブルからの読み取りとは異なり、各データ読み取り操作は 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>/...例:ある会社が日々のログファイルを CSV 形式で OSS に保存し、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/';クエリの最適化
動的統計収集
データは外部データレイクに保存されており、既存の統計情報がないため、クエリオプティマイザーは保守的な戦略を使用し、クエリ効率が低くなります。動的統計収集機能により、オプティマイザーはクエリ実行中に一時的にテーブル統計を収集して小規模なテーブルを識別できます。その後、ハッシュ結合などの手法を積極的に使用し、結合順序を最適化し、シャッフルを削減し、実行パイプラインを短縮してクエリの最適化を実現します。
以下のパラメーターは、Paimon、Hudi、または Delta Lake 外部テーブルには適用されません。
SET odps.meta.exttable.stats.onlinecollect=true; SELECT * FROM <tablename>;外部テーブルの分割の最適化
分割サイズパラメーターを設定して、単一の同時実行タスクで処理されるデータ量を調整することで、クエリ効率を最適化できます。分割サイズの設定には次の効果があります。
テーブルのデータ量が非常に大きく、毎回読み取るデータ量が少なすぎる場合、分割数が多すぎて過剰な並列処理が発生します。その結果、インスタンスはほとんどの時間をリソースの待機に費やします。
テーブルのデータ量が非常に少なく、毎回読み取るデータ量が多すぎる場合、分割数が少なすぎて同時実行性が不足します。その結果、ほとんどのリソースがアイドル状態になります。
-- 以下のパラメーターのいずれかを使用できます。 -- 単位: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>;
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');次の図は、生成されたファイルを示しています。

出力 OSS ファイルに拡張子が自動的に生成されます。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; 例
約 4 GB の JSON ファイルを OSS に書き込みます。
テストデータを準備します。パブリックデータセットテーブル
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 からのエクスポート
LOAD コマンド:OSS などの外部ストレージから MaxCompute テーブルまたはパーティションにデータをインポートします。
UNLOAD コマンド:MaxCompute プロジェクトから OSS などの外部ストレージにデータをエクスポートし、他のコンピュートエンジンで使用します。
付録:サンプルデータの準備
OSS ディレクトリの準備
提供されるサンプルデータ情報は次のとおりです。
oss_endpoint:
oss-cn-hangzhou-internal.aliyuncs.com、これは中国 (杭州) です。バケット名:
oss-mc-test。ディレクトリ名:
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 データを処理する際に「Inline data exceeds the maximum allowed size」エラーを解決するにはどうすればよいですか?
MaxCompute 上で OSS 外部テーブルにアクセスする UDF をアップロードした後、ローカルテストは合格したにもかかわらずメモリオーバーフローエラーが発生する場合、どうすれば解決できますか?
OSS 外部テーブルからの読み取り時に「Couldn't connect to server」エラーを解決するにはどうすればよいですか?
OSS 外部テーブル作成時に「Network is unreachable (connect failed)」エラーを解決するにはどうすればよいですか?
OSS マルチパートアップロード機能を使用しているときに、古いデータは削除されるが新しいデータが書き込まれない問題を解決するにはどうすればよいですか?
外部テーブルを使用して 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; # reduce ステージのワーカー数を調整します。
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 外部テーブルを使用して複数の小規模ファイルを単一ファイルにマージするにはどうすればよいですか?
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 外部テーブルを作成しました。データ読み取りプロセスが遅いです。
原因
map ステージで計算を実行しているマッパーが少なすぎるため、SQL 処理速度が遅くなっています。
解決策
構造化データの場合、次のパラメーターを設定して、単一のマッパーが読み取るデータ量を調整し、SQL 実行を高速化できます。
set odps.sql.mapper.split.size=256; # 各マッパーが読み取るテーブルデータサイズを調整します (MB 単位)。非構造化データの場合、OSS 外部テーブルパスに OSS ファイルが 1 つしかないか確認します。1 つしかない場合、圧縮形式の非構造化データは分割できないため、マッパーは 1 つしか生成されません。これにより、処理速度が遅くなります。大きな OSS ファイルを、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 に書き込む:カスタムパーサー。
OSS ファイルを、列のフィルタリングと処理をサポートするスキーマを持つデータセットに解析する:特別機能:スキーマレスクエリ。