このトピックでは、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 ファイルのフィールドが | 固定値なし | なし |
odps.ext.column.mapping.delimiters (カラム名内の文字がカラム名マッピングのデフォルトのデリミタと競合する場合にのみ使用します。通常は推奨されません。) | カラム名に特殊文字 | このプロパティは、キーと値のペアのグループ内およびグループ間のデリミタをカスタマイズします。値には正確に 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 にアクセスする権限が必要です。OSS 外部テーブルには、Alibaba Cloud アカウント、RAM ユーザー、または RAM ロールを使用してアクセスできます。権限付与方法の詳細は、「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 ファイルを読み書きするには、テーブル作成時に tblproperties セクションで mcfed.orc.compress プロパティを設定します。詳細については、「tblproperties」をご参照ください。
圧縮プロパティ | 読み取り | 書き込み |
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 を許容します。 | 適用外 |
名前ベース | いいえ |