このトピックでは、OSS の ORC 外部テーブルの作成、読み取り、書き込みの方法について説明します。
制限事項
OSS 外部テーブルはクラスタープロパティをサポートしていません。
単一ファイルのサイズは 2 GB を超えることはできません。2 GB を超えるファイルは分割する必要があります。
MaxCompute と OSS は同じリージョンにある必要があります。
権限の説明
OSS 外部テーブルにアクセスする際、Alibaba Cloud アカウント、RAM ユーザー、または RAM ロールのいずれを使用しているかに関わらず、データは
odps.properties.rolearnパラメーターで指定されたロールを通じてアクセスされます。したがって、RAM ロールを作成し、対象の OSS バケットへのアクセス権限を付与した後、そのロールの ARN をodps.properties.rolearnパラメーターに設定する必要があります。詳細については、「パラメーター」をご参照ください。ビジネス要件に応じて、同一アカウントまたはクロスアカウントのアクセスを許可できます。よりきめ細かなアクセス制御を行うには、カスタム権限付与ポリシーを使用することを推奨します。詳細については、「外部データソースの権限付与」をご参照ください。
外部テーブルの作成
構文
ORC ファイルのスキーマと外部テーブルのスキーマが一致しない場合、MaxCompute は以下のように差異を処理します。
ファイル内の列がテーブルよりも少ない場合:欠落している列は NULL で埋められます。
ファイル内の列がテーブルよりも多い場合:余分な列は破棄されます。
型が一致しない場合:STRING は ORC ファイルから INT データを読み取ることができますが、これは推奨されません。INT が STRING データを読み取る場合、非数値は NULL に変換され、数値は読み取られます。
ORC 外部テーブルを作成するには、簡易構文または完全な構文のいずれかを使用します。
簡易構文 (推奨)
この構文は、MaxCompute がデフォルトの RAM ロールを使用して自動的に権限付与を処理する場合に使用します。
CREATE EXTERNAL TABLE [IF NOT EXISTS] <mc_oss_extable_name>
(
<col_name> <data_type>,
...
)
[COMMENT <table_comment>]
[PARTITIONED BY (<col_name> <data_type>, ...)]
STORED AS ORC
LOCATION '<oss_location>';完全な構文
CREATE EXTERNAL TABLE [IF NOT EXISTS] <mc_oss_extable_name>
(
<col_name> <data_type>,
...
)
[COMMENT <table_comment>]
[PARTITIONED BY (<col_name> <data_type>, ...)]
ROW FORMAT SERDE 'org.apache.hadoop.hive.ql.io.orc.OrcSerde'
WITH serdeproperties(
'odps.properties.rolearn'='acs:ram::<uid>:role/<role_name>'
)
STORED AS ORC
LOCATION '<oss_location>'
tblproperties (
'<xxx>'='<yyy>'
);共通パラメーター
共通パラメーターの詳細については、「基本構文パラメーター」をご参照ください。
フォーマット固有のパラメーター
WITH serdeproperties
プロパティ | 用途 | 値 | デフォルト |
| 同一の外部テーブル内の ORC ファイル間でスキーマに一貫性がない場合。 |
|
|
tblproperties
プロパティ | 用途 | 説明 | 値 | デフォルト |
| ORC データを圧縮形式で OSS に書き込む場合。 圧縮ファイルの読み取り時に追加のパラメーター設定は不要です。 | ORC 出力ファイルの圧縮アルゴリズム。 |
| なし |
| 出力ファイルにカスタムプレフィックスを追加する場合。 | プレフィックス文字列。使用可能な文字:英字、数字、アンダースコア (a–z、A–Z、0–9、_)。長さ:1~10 文字。 | 例: | なし |
| 出力ファイルに拡張子を含めるかどうかを制御する場合。 |
|
|
|
| 出力ファイルにカスタムサフィックスを追加する場合。 | サフィックス文字列。使用可能な文字:英字、数字、アンダースコア。 | 例: | なし |
| 出力ファイルにカスタム拡張子を追加します。 | 拡張子文字列。使用可能な文字:英字、数字、アンダースコア。長さ:1~10 文字。 | 例: | なし |
odps.ext.column.mapping | OSS データファイルのフィールド名に特殊文字が含まれている場合に、このプロパティを追加します。 | このプロパティは、カスタムの列名マッピングを定義します。たとえば、OSS ファイルのフィールドが id BIGINT、$_test DOUBLE、=name STRING の場合、外部テーブルの作成時にパラメーター値を t_test:$_test,t_name:=name に設定します。特殊文字を含むフィールドのマッピングのみを指定する必要があります。 | 固定値なし | なし |
(列名に含まれる文字が列名マッピングのデフォルトの区切り文字と競合する場合にのみ使用します。一般的には推奨されません。) | カラム名に特殊文字 | このプロパティは、キーと値のペアのグループ内およびグループ間の区切り文字をカスタマイズします。値には正確に 2 文字を含める必要があり、最初の文字がキーと値の区切り文字として、2 番目の文字が異なるキーと値のペア間の区切り文字として機能します。 | 固定値はありません。例: | デフォルト値:
|
| メモリ使用量と処理スループットを調整する場合。 | バッチごとに処理される行数 (ORC バッチサイズ)。 | 非負整数 |
|
ホワイトリストとブラックリスト
MaxCompute の OSS 外部テーブルは、ホワイトリストとブラックリストによるフィルタリングをサポートしています。tblproperties でホワイトリストとブラックリストのパラメーターを設定することで、ディレクトリから読み取るファイルをフィルタリングできます。詳細については、「ホワイトリストとブラックリスト」をご参照ください。
データの書き込み
MaxCompute での書き込み構文の詳細については、「書き込み構文」をご参照ください。
データのクエリ
SELECT 構文の詳細については、「クエリ構文」をご参照ください。
クエリプランの最適化の詳細については、「クエリの最適化」をご参照ください。
述語プッシュダウンの有効化
述語プッシュダウン (PPD) は、フィルター条件をデータスキャンレイヤーにプッシュダウンすることで、ORC 外部テーブルでのクエリパフォーマンスを向上させます。PPD には、ネイティブモード (
odps.ext.oss.orc.native=true) が必要です。SQL クエリの前に次のステートメントを追加します。
-- ORC ネイティブリーダーを有効化 SET odps.ext.oss.orc.native=true; -- ORC 述語プッシュダウンを有効化 SET odps.storage.orc.use.predicate.pushdown=true;
例
この例では、SNAPPY 圧縮を使用した ORC 外部テーブルを作成し、既存のパーティションを追加し、データを読み取り、新しい行を書き込みます。
前提条件
MaxCompute プロジェクトを作成済みであること。
OSS バケットとディレクトリを準備していること。詳細については、「バケットの作成」および「ディレクトリの管理」をご参照ください。
バケットが MaxCompute プロジェクトと同じリージョンにあることを確認してください。
権限の付与
OSS にアクセスする権限を持っていること。Alibaba Cloud アカウント、RAM ユーザー、または RAM ロールを使用して OSS 外部テーブルにアクセスできます。権限を付与する方法の詳細については、「OSS の STS モード承認」をご参照ください。
MaxCompute プロジェクトの CreateTable 権限を持っていること。テーブル関連の権限の詳細については、「MaxCompute 権限」をご参照ください。
手順 1:データファイルの準備
提供されている サンプルデータ を使用して、oss-mc-test バケットにフォルダーパス orc_snappy/dt=20250526 を作成します。 snappy ファイル を dt=20250526 パーティションフォルダーにアップロードします。
手順 2:外部テーブルの作成
CREATE EXTERNAL TABLE orc_data_type_snappy
(
vehicleId INT,
recordId INT,
patientId INT,
calls INT,
locationLatitute DOUBLE,
locationLongitude DOUBLE,
recordTime STRING,
direction STRING
)
PARTITIONED BY (dt STRING)
ROW FORMAT SERDE 'org.apache.hadoop.hive.ql.io.orc.OrcSerde'
WITH serdeproperties (
'odps.properties.rolearn'='acs:ram::<uid>:role/<role_name>'
)
STORED AS ORC
LOCATION 'oss://oss-cn-hangzhou-internal.aliyuncs.com/oss-mc-test/orc_snappy/'
tblproperties (
'mcfed.orc.compress'='SNAPPY'
);手順 3:既存パーティションの追加
パーティション化された外部テーブルの場合、MSCK REPAIR TABLE を実行して、既存の OSS パーティションを MaxCompute に登録します。完全な構文については、「OSS 外部テーブルにパーティションを追加する」をご参照ください。
MSCK REPAIR TABLE orc_data_type_snappy ADD PARTITIONS;手順 4:データの読み取り
SELECT * FROM orc_data_type_snappy WHERE dt = '20250526' LIMIT 10;クエリは以下を返します:
+------------+------------+------------+------------+------------------+-------------------+----------------+------------+------------+
| vehicleid | recordid | patientid | calls | locationlatitute | locationlongitude | recordtime | direction | dt |
+------------+------------+------------+------------+------------------+-------------------+----------------+------------+------------+
| 1 | 12 | 76 | 1 | 46.81006 | -92.08174 | 9/14/2014 0:10 | SW | 20250526 |
| 1 | 1 | 51 | 1 | 46.81006 | -92.08174 | 9/14/2014 0:00 | S | 20250526 |
| 1 | 2 | 13 | 1 | 46.81006 | -92.08174 | 9/14/2014 0:01 | NE | 20250526 |
| 1 | 3 | 48 | 1 | 46.81006 | -92.08174 | 9/14/2014 0:02 | NE | 20250526 |
| 1 | 4 | 30 | 1 | 46.81006 | -92.08174 | 9/14/2014 0:03 | W | 20250526 |
| 1 | 5 | 47 | 1 | 46.81006 | -92.08174 | 9/14/2014 0:04 | S | 20250526 |
| 1 | 6 | 9 | 1 | 46.81006 | -92.08174 | 9/14/2014 0:05 | S | 20250526 |
| 1 | 7 | 53 | 1 | 46.81006 | -92.08174 | 9/14/2014 0:06 | N | 20250526 |
| 1 | 8 | 63 | 1 | 46.81006 | -92.08174 | 9/14/2014 0:07 | SW | 20250526 |
| 1 | 9 | 4 | 1 | 46.81006 | -92.08174 | 9/14/2014 0:08 | NE | 20250526 |
| 1 | 10 | 31 | 1 | 46.81006 | -92.08174 | 9/14/2014 0:09 | N | 20250526 |
+------------+------------+------------+------------+------------------+-------------------+----------------+------------+------------+手順 5:データの書き込み
INSERT INTO orc_data_type_snappy PARTITION (dt = '20250526')
VALUES (1, 16, 76, 1, 46.81006, -92.08174, '9/14/2014 0:10', 'SW');
-- 挿入された行を検証
SELECT * FROM orc_data_type_snappy WHERE dt = '20250526' AND recordid = 16;クエリは以下を返します:
+------------+------------+------------+------------+------------------+-------------------+----------------+------------+------------+
| vehicleid | recordid | patientid | calls | locationlatitute | locationlongitude | recordtime | direction | dt |
+------------+------------+------------+------------+------------------+-------------------+----------------+------------+------------+
| 1 | 16 | 76 | 1 | 46.81006 | -92.08174 | 9/14/2014 0:10 | SW | 20250526 |
+------------+------------+------------+------------+------------------+-------------------+----------------+------------+------------+サポートされているデータ型
MaxCompute のデータ型の完全なリストについては、「データ型バージョン 1.0」および「データ型バージョン 2.0」をご参照ください。
MaxCompute は、ORC 外部テーブルを読み取るための 2 つのモードをサポートしています。
JNI モード (
SET odps.ext.oss.orc.native=false;): 読み取りと書き込みの両方の操作をサポートします。ネイティブモード (
SET odps.ext.oss.orc.native=true;): 読み取り操作のみをサポートします。
データ型 | JNI モード (読み取りおよび書き込み) | ネイティブモード (読み取り専用) |
TINYINT | はい | はい |
SMALLINT | はい | はい |
INT | はい | はい |
BIGINT | はい | はい |
BINARY | はい | はい |
FLOAT | はい | はい |
DOUBLE | はい | はい |
DECIMAL(precision,scale) | はい | はい |
VARCHAR(n) | はい | はい |
CHAR(n) | はい | はい |
STRING | はい | はい |
DATE | はい | はい |
DATETIME | いいえ | はい |
TIMESTAMP | いいえ | いいえ |
TIMESTAMP_NTZ | はい | いいえ |
BOOLEAN | はい | はい |
ARRAY | はい | はい |
MAP | はい | はい |
STRUCT | はい | はい |
JSON | いいえ | いいえ |
サポートされている圧縮形式
圧縮された ORC ファイルを読み書きするには、テーブルを作成するときに with serdeproperties セクションに mcfed.orc.compress プロパティを追加します。詳細については、「WITH serdeproperties」をご参照ください。
圧縮プロパティ | 読み取り | 書き込み |
ZSTD | はい | はい |
SNAPPY (SnappyRawCodec) | はい | はい |
SNAPPY (SnappyCodec) | はい | いいえ |
ZLIB | はい | はい |
サポートされているスキーマ進化
ORC 外部テーブルは、テーブルの列を ORC ファイルのフィールドにマッピングするための 2 つの方法をサポートしています:位置ベースのマッピングと名前ベースのマッピングです。
位置ベースのマッピング (デフォルト):
'mcfed.orc.schema.resolution'='position'を設定するか、このプロパティを省略します。 列は順序で照合されるため、テーブルの列の順序が ORC ファイルのフィールドの順序と完全に一致する必要があります。名前によるマッピング:
'mcfed.orc.schema.resolution'='name'を設定します。列は順序に関係なく、名前で照合されます。
以下の表は、どのスキーマ変更操作が各マッピング方法と互換性があるかを示しています。「互換性あり」とは、操作後に新しく書き込まれたデータと履歴データの両方が正しく読み取れることを意味します。
スキーマ変更 | マッピングモード | サポート状況 | 説明 | データ互換性 |
列の追加 | 位置ベース | はい |
|
たとえば、列が追加された後、新しい列がない履歴行では、その列に対して NULL が返されます。 |
名前ベース | はい | |||
列の削除 | 位置ベース | いいえ | 非推奨。位置ベースのマッピングでは、DDL の列の順序がファイルと一致している必要があります。列を削除すると、DDL とファイルのスキーマが一致しなくなり、読み取りエラーの原因となります。 |
たとえば、列が削除された後、削除された列をまだ含んでいる履歴データで読み取りエラーが発生します。 |
名前ベース | はい | 名前ベースのマッピングは、列の順序に関係なく、名前で列を照合します。 | 互換性あり | |
列の順序変更 | 位置ベース | いいえ | 非推奨。位置ベースのマッピングでは、DDL の列の順序がファイルと一致している必要があります。列の順序を変更すると、DDL とファイルのスキーマが一致しなくなり、読み取りエラーの原因となります。 |
たとえば、列の順序が変更された後、履歴データは元の順序を保持しているため、スキーマとデータの不整合が発生します。 |
名前ベース | はい | 名前ベースのマッピングは、列の順序に関係なく、名前で列を照合します。 | 互換性あり | |
列のデータ型変更 | 位置ベース | はい | 許可される型変換については、「列のデータ型変更」をご参照ください。 | 互換性あり |
名前ベース | はい | |||
列名の変更 | 位置ベース | はい | 互換性あり | |
名前ベース | いいえ | 非推奨。名前ベースのマッピングは名前で列を照合します。列の名前を変更すると、元の名前を使用している既存のファイルは照合できなくなります。 |
たとえば、列の名前が変更された後、ORC ファイルのスキーマがまだ元の名前を使用している場合、読み取り時にその列の値は NULL になります。 | |
列コメントの変更 | 位置ベース | はい | コメントは 1,024 バイト以下の有効な文字列である必要があります。 | 互換性あり |
名前ベース | はい | |||
列の Null 許容属性の変更 | 位置ベース | いいえ | 列はデフォルトで NULL 値を許容します。 | 該当なし |
名前ベース | いいえ |