このトピックでは、ORC フォーマットの OSS 外部テーブルを作成、読み取り、書き込みする方法について説明します。
適用範囲
OSS 外部テーブルはクラスタープロパティをサポートしていません。
単一ファイルのサイズは 2 GB を超えることはできません。ファイルが大きすぎる場合は、分割してください。
MaxCompute と OSS は同じリージョンにある必要があります。
サポートされるデータの型
MaxCompute のデータの型の詳細については、「データ型バージョン 1.0」および「データ型バージョン 2.0」をご参照ください。
Java Native Interface (JNI) モード (ネイティブ ORC リーダーを使用してテーブルを読み取らない場合):
set odps.ext.oss.orc.native=false;。読み取りと書き込みの両方の操作がサポートされています。ネイティブモード (ネイティブ ORC リーダーを使用してテーブルを読み取る場合):
set odps.ext.oss.orc.native=true;。読み取り操作のみがサポートされています。
パターン | 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 ファイルの読み取りまたは書き込みを行うには、CREATE TABLE 文に
with serdepropertiesプロパティを追加する必要があります。詳細については、「WITH SERDEPROPERTIES のパラメーター」をご参照ください。SNAPPY または ZLIB を使用して圧縮された ORC ファイルの読み取りと書き込みができます。
外部テーブルの作成
構文
ORC ファイル内のスキーマが外部テーブルのスキーマと一致しない場合:
列数が一致しない場合: ORC ファイルの列数がデータ定義言語 (DDL) 文で定義された外部テーブルよりも少ない場合、MaxCompute はデータの読み取り時に不足している列を NULL 値で埋めます。ORC ファイルの列数が多い場合、余分な列は破棄されます。
列の型が一致しない場合: MaxCompute では、ORC ファイルから INT データを STRING 型として読み取ることができますが、この方法は推奨されません。STRING データを INT 型として読み取ろうとすると、文字列値は 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 フォーマットの場合、このプロパティを追加します。 | このパラメーターを設定すると、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 |
odps.external.data.output.suffix | 出力ファイル名にカスタムサフィックスを指定する場合、このプロパティを追加します。 | サフィックスには、数字、文字、アンダースコア (_) のみを含めることができます。 | '_hangzhou' のような有効な文字列。 | None |
odps.external.data.output.explicit.extension | 出力ファイルにカスタム拡張子を指定する場合、このプロパティを追加します。 |
| "jsonl" のような有効な文字列。 | None |
mcfed.orc.batch.size | 一度に処理されるレコード数を制御します。これはメモリ使用量と処理効率に影響します。 | ORC チューニングプロパティ。ORC のデフォルトのバッチサイズを行数で定義します。 | 負でない整数 | 1000 |
データ書き込み
MaxCompute の書き込み構文の詳細については、「書き込み構文」をご参照ください。
クエリと分析
SELECT 構文の詳細については、「クエリ構文」をご参照ください。
クエリプランの最適化の詳細については、「クエリの最適化」をご参照ください。
ORC 外部テーブルは、述語プッシュダウン (PPD) を有効にすることでクエリの最適化をサポートします。PPD を有効にするには、SQL 文の前に次のパラメーターを追加します:
PPD パラメーターはネイティブモードでのみ使用されます。ネイティブモードでは、ネイティブスイッチを true に設定する必要があります。
-- ORC ネイティブリーダーを有効にします。 SET odps.ext.oss.orc.native=true; -- ORC PPD を有効にします。 SET odps.storage.orc.use.predicate.pushdown=true;
利用シーン
このセクションでは、SNAPPY 圧縮を使用する ORC 外部テーブルを作成し、そのテーブルからデータを読み取り、書き込む方法について説明します。
前提条件
MaxCompute プロジェクトを作成済みであること。
OSS バケットとフォルダを準備します。詳細については、「バケットの作成」および「フォルダの管理」をご参照ください。
MaxCompute は一部のリージョンにのみデプロイされています。データ接続性の問題を回避するため、MaxCompute プロジェクトと同じリージョンにある OSS バケットを使用してください。
権限付与
OSS にアクセスするための権限が必要です。Alibaba Cloud アカウント、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 | +------------+------------+------------+------------+------------------+-------------------+----------------+------------+------------+