このトピックでは、ORC フォーマットの OSS 外部テーブルを作成、読み取り、書き込みする方法について説明します。
適用範囲
OSS 外部テーブルはクラスタープロパティをサポートしていません。
単一ファイルのサイズは 2 GB を超えることはできません。2 GB を超えるファイルは分割する必要があります。
MaxCompute と OSS は同じリージョンにある必要があります。
外部テーブルの作成
構文
ORC ファイルのスキーマが外部テーブルのスキーマと一致しない場合:
列数が一致しない場合: ORC ファイルの列数が外部テーブルより少ない場合、データの読み取り時に不足している列は NULL 値で補完されます。ファイルの列数が多い場合、余分な列は破棄されます。
列の型が一致しない場合: MaxCompute は、STRING 型を使用して ORC ファイルから INT データを読み取ることをサポートしていますが、これは推奨されません。INT 型を使用して STRING データを読み取る場合、システムは文字列値を NULL に変換し、数値のみを受け入れます。
簡易構文
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/aliyunodpsdefaultrole'
)
STORED AS orc
LOCATION '<oss_location>'
tblproperties (
'<xxx>'='<yyy>'
);共通パラメーター
共通パラメーターの詳細については、「基本的な構文パラメーター」をご参照ください。
固有パラメーター
with serdeproperties のプロパティ
プロパティ名 | シナリオ | 説明 | プロパティ値 | デフォルト値 |
mcfed.orc.schema.resolution | 同じ OSS 外部テーブル内のデータのスキーマが一致しない場合にこのプロパティを追加します。 | ORC ファイルの解析メソッドを設定します。 | name | デフォルトでは列番号で解析します。 以下と同等です: |
tblproperties のプロパティ
プロパティ名 | シナリオ | 説明 | プロパティ値 | デフォルト値 |
mcfed.orc.compress | 圧縮フォーマットで ORC データを OSS に書き込む場合にこのプロパティを追加します。 | ORC 圧縮プロパティ。ORC データの圧縮メソッドを指定します。 |
| None |
io.compression.codecs | OSS データファイルが Raw-Snappy フォーマットの場合にこのプロパティを追加します。 | このパラメーターを True に設定すると、MaxCompute は圧縮データを正常に読み取ることができます。それ以外の場合、MaxCompute はデータを読み取れません。 | com.aliyun.odps.io.compress.SnappyRawCodec | None |
odps.external.data.output.prefix (odps.external.data.prefix と互換性あり) | 出力ファイルにカスタムプレフィックスを追加する場合にこのプロパティを追加します。 |
| 有効な文字の組み合わせ (例: 'mc_')。 | None |
odps.external.data.enable.extension | 出力ファイルの拡張子を表示する場合にこのプロパティを追加します。 | True は出力ファイルの拡張子を表示し、False は非表示にします。 |
| False |
odps.external.data.output.suffix | 出力ファイルにカスタムサフィックスを追加する場合にこのプロパティを追加します。 | 数字、文字、アンダースコア (a-z, A-Z, 0-9, _) のみを含みます。 | 有効な文字の組み合わせ (例: '_hangzhou')。 | None |
odps.external.data.output.explicit.extension | 出力ファイルにカスタム拡張子を追加する場合にこのプロパティを追加します。 |
| 有効な文字の組み合わせ (例: "jsonl")。 | None |
mcfed.orc.batch.size | 一度に処理されるレコード数を制御し、メモリ使用量と処理効率に影響します。 | ORC チューニングプロパティ。デフォルトの ORC バッチサイズを行数で定義します。 | 非負整数 | 1000 |
データの書き込み
MaxCompute の書き込み構文の詳細については、「書き込み構文」をご参照ください。
クエリ分析
SELECT 構文の詳細については、「クエリ構文」をご参照ください。
クエリプランの最適化の詳細については、「クエリの最適化」をご参照ください。
述語プッシュダウン (PPD) を有効にすることで、ORC 外部テーブルに対するクエリを最適化できます。そのためには、SQL 文の前に次のパラメーターを追加します:
PPD パラメーターはネイティブモードで使用する必要があります。つまり、ネイティブスイッチを true に設定する必要があります。
-- ORC ネイティブリーダーを有効にします。 SET odps.ext.oss.orc.native-true; -- ORC PPD を有効にします。 SET odps.storage.orc.use.predicate.pushdown=true;
シナリオ例
この例では、SNAPPY 圧縮を使用する ORC 外部テーブルを作成し、そのテーブルからデータを読み書きする方法を示します。
前提条件
OSS バケットと OSS ディレクトリを準備済みであること。詳細については、「バケットの作成」および「フォルダの管理」をご参照ください。
MaxCompute は特定のリージョンでのみ利用可能なため、リージョン間の接続性の問題が発生する可能性があります。ご利用の MaxCompute プロジェクトと同じリージョンにある OSS バケットを使用することを推奨します。
権限付与
OSS にアクセスする権限を持っていること。Alibaba Cloud アカウント (プライマリアカウント)、Resource Access Management (RAM) ユーザー、または RAM ロールは、OSS 外部テーブルにアクセスできます。権限付与の詳細については、「OSS の STS モードでの権限付与」をご参照ください。
MaxCompute プロジェクトで CreateTable 権限を持っていること。テーブル操作の権限の詳細については、「MaxCompute の権限」をご参照ください。
SNAPPY フォーマットのデータファイルを準備します。
提供されているサンプルデータを使用して、
oss-mc-testバケットにフォルダパスorc_snappy/dt=20250526を作成します。SNAPPY ファイルをdt=20250526パーティションフォルダにアップロードします。SNAPPY 圧縮を使用する ORC 外部テーブルを作成します。
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/aliyunodpsdefaultrole' ) STORED AS ORC LOCATION 'oss://oss-cn-hangzhou-internal.aliyuncs.com/oss-mc-test/orc_snappy/' tblproperties ( 'mcfed.orc.compress'='SNAPPY');OSS 外部テーブルがパーティション化されている場合は、次のコマンドを実行して既存のパーティションを追加します。詳細については、「OSS 外部テーブルにパーティションを追加する構文」をご参照ください。
-- 外部テーブルにパーティションを追加します MSCK REPAIR TABLE orc_data_type_snappy ADD PARTITIONS;ORC 外部テーブルからデータを読み取ります。
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 | +------------+------------+------------+------------+------------------+-------------------+----------------+------------+------------+ORC 外部テーブルにデータを書き込み、そのデータをクエリします。
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」をご参照ください。
JNI モード (
set odps.ext.oss.orc.native=false;): このモードでは、テーブル読み取り時にネイティブ ORC リーダーを使用しません。読み取りと書き込みの両方の操作をサポートします。ネイティブモード (
set odps.ext.oss.orc.native=true;): このモードでは、テーブル読み取り時にネイティブ ORC リーダーを使用します。読み取り操作のみをサポートします。
モード | Java モード (読み取りと書き込み) | ネイティブモード (読み取り専用) |
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 |
サポートされている圧縮フォーマット
圧縮された OSS ファイルを読み書きするには、テーブル作成文に
with serdeproperties構成を追加する必要があります。詳細については、「with serdeproperties のプロパティパラメーター」をご参照ください。MaxCompute は、SNAPPY または ZLIB で圧縮された ORC ファイルの読み書きをサポートしています。
スキーマエボリューションのサポート
ORC 外部テーブルは、テーブルスキーマをデータファイル内の列にマッピングするために、位置ベースのマッピングと名前ベースのマッピングの 2 つのメソッドをサポートしています。
位置ベースのマッピング: このメソッドを使用するには、
'mcfed.orc.schema.resolution'='position'パラメーターを設定するか、省略してデフォルト設定を使用します。システムは位置に基づいて列をマッピングします。したがって、テーブルの列の順序は、ファイル内のフィールドの順序と完全に一致する必要があります。名前ベースのマッピング: このメソッドを使用するには、外部テーブルの作成時に
'mcfed.orc.schema.resolution'='name'パラメーターを設定します。これにより、システムは位置ではなく名前で列をマッピングします。
次の表のデータ互換性の問題では、スキーマエボリューション操作後に外部テーブルがデータを正しく読み取れるかどうかを説明します。これには、変更されたスキーマに準拠する新しいデータと、古いスキーマを使用する既存データの読み取りが含まれます。
操作タイプ | マッピングメソッド | サポート | 説明 | データ互換性の問題 |
列の追加 | 位置ベースのマッピング |
|
| |
名前ベースのマッピング | ||||
列の削除 | 位置ベースのマッピング | 非推奨。ORC 外部テーブルは位置によって列の値をマッピングします。テーブルの列の順序は、ファイル内のフィールドの順序と一致する必要があります。列の削除操作後、ファイルとテーブルのフィールドが一致しない場合、テーブルの読み取り時にエラーが発生します。 |
| |
名前ベースのマッピング | 名前ベースのマッピングでは、システムは列名に基づいて自動的に照合するため、順序に依存しなくなります。 | 互換性あり | ||
列の順序変更 | 位置ベースのマッピング | 非推奨。ORC 外部テーブルは位置によって列の値をマッピングします。テーブルの列の順序は、ファイル内のフィールドの順序と一致する必要があります。列の削除操作後、ファイルとテーブルのフィールドが一致しない場合、テーブルの読み取り時にエラーが発生します。 |
| |
名前ベースのマッピング | 名前ベースのマッピングでは、システムは列名に基づいて自動的に照合するため、順序に依存しなくなります。 | 互換性あり | ||
列のデータ型変更 | 位置ベースのマッピング | データ型の変換テーブルの詳細については、「列のデータ型変更」をご参照ください。 | 互換性あり | |
名前ベースのマッピング | ||||
列名の変更 | 位置ベースのマッピング | 互換性あり | ||
名前ベースのマッピング | 非推奨。名前ベースのマッピングでは、システムは列名に基づいて自動的に照合します。列名を変更すると、一致する可能性があった元の列名がファイル内で見つからなくなる可能性があります。 |
| ||
列コメントの変更 | 位置ベースのマッピング | コメントの内容は、長さが 1024 バイトを超えない有効な文字列である必要があります。それ以外の場合はエラーが報告されます。 | 互換性あり | |
名前ベースのマッピング | ||||
列の NULL 値許容プロパティの変更 | 位置ベースのマッピング | この操作はサポートされていません。デフォルトで NULL 値を許容します。 | 該当なし | |
名前ベースのマッピング |