本トピックでは、OSS で AVRO フォーマットの外部テーブルを作成、読み取り、書き込みする方法について説明します。
適用範囲
OSS 外部テーブルは、クラスタープロパティをサポートしていません。
単一ファイルのサイズは 2 GB を超えることはできません。ファイルが大きすぎる場合は、分割してください。
MaxCompute と OSS は、同じリージョンに配置する必要があります。
サポートされるデータの型
MaxCompute のデータの型の詳細については、「データの型 (V1.0)」および「データの型 (V2.0)」をご参照ください。
データの型 | サポート | データの型 | サポート |
TINYINT |
| STRING |
|
SMALLINT |
| DATE |
|
INT |
| DATETIME |
|
BIGINT |
| TIMESTAMP |
|
BINARY |
| TIMESTAMP_NTZ |
|
FLOAT |
| BOOLEAN |
|
DOUBLE |
| ARRAY |
|
DECIMAL(precision,scale) |
| MAP |
|
VARCHAR(n) |
| STRUCT |
|
CHAR(n) |
| JSON |
|
外部テーブルの作成
構文
CREATE EXTERNAL TABLE <mc_oss_extable_name>
(
<col_name> <data_type>,
...
)
[COMMENT <table_comment>]
[PARTITIONED BY (<col_name> <data_type>, ...)]
STORED AS avro
LOCATION '<oss_location>';パラメーター
詳細については、「基本的な構文パラメーター」をご参照ください。
データの書き込み
MaxCompute から OSS にデータを書き込む構文の詳細については、「OSS へのデータの書き込み」をご参照ください。
クエリと分析
SELECT 構文の詳細については、「OSS からのデータの読み取り」をご参照ください。
クエリ計画の最適化の詳細については、「クエリの最適化」をご参照ください。
例
次の例では、組み込みのオープンソースデータパーサを使用して AVRO フォーマットの外部テーブルを作成し、OSS にデータを書き込み、そのデータをクエリする方法を示します。
前提条件
OSS バケットとフォルダが利用可能であること。詳細については、「バケットの作成」および「フォルダの管理」をご参照ください。
MaxCompute は、OSS でのフォルダの自動作成をサポートしています。SQL 文に外部テーブルとユーザー定義関数 (UDF) が含まれている場合、1 つの文でテーブルの読み取りと書き込み、および UDF の使用が可能です。フォルダは手動で作成することもできます。
MaxCompute は特定のリージョンにのみデプロイされます。リージョン間のデータ接続で発生しうる問題を回避するため、ご利用の OSS バケットがご利用の MaxCompute プロジェクトと同じリージョンにあることを確認してください。
権限付与
OSS にアクセスする権限が必要です。Alibaba Cloud アカウント、Resource Access Management (RAM) ユーザー、または RAM ロールを使用して OSS 外部テーブルにアクセスできます。権限付与の詳細については、「STS モードでの OSS へのアクセスの承認」をご参照ください。
MaxCompute プロジェクトで CreateTable 権限が必要です。テーブル権限の詳細については、「MaxCompute の権限」をご参照ください。
テストデータのアップロード
OSS コンソールにログインし、テストデータファイル 20250612TableSink をご利用の OSS バケットの
external-table-test/avro/dt=20250521/フォルダにアップロードします。詳細については、「ファイルのアップロード」をご参照ください。AVRO フォーマットの外部テーブルの作成
CREATE EXTERNAL TABLE mc_oss_extable_name_avro_pt ( vehicleId STRING, recordId STRING, patientId STRING, calls STRING, locationLatitute STRING, locationLongtitue STRING, recordTime STRING, direction STRING ) PARTITIONED BY (dt STRING) STORED AS avro LOCATION 'oss://oss-cn-hangzhou-internal.aliyuncs.com/external-table-test/avro/';パーティションデータのインポート。OSS 外部テーブルがパーティションテーブルの場合、パーティションデータをインポートする必要があります。詳細については、「OSS 外部テーブルにパーティションデータを追加するための構文」をご参照ください。
-- パーティションデータをインポートします。 MSCK REPAIR TABLE mc_oss_extable_name_avro_pt ADD PARTITIONS;AVRO 外部テーブルからのデータの読み取り
SELECT * FROM mc_oss_extable_name_avro_pt WHERE dt=20250521;次の結果が返されます:
+------------+------------+------------+------------+------------------+-------------------+------------+------------+------------+ | vehicleid | recordid | patientid | calls | locationlatitute | locationlongtitue | recordtime | direction | dt | +------------+------------+------------+------------+------------------+-------------------+------------+------------+------------+ | 1 | 12 | 76 | 1 | 46.81006 | -92.08174 | 9/14/2014 0:10 | SW | 20250521 | | 1 | 1 | 51 | 1 | 46.81006 | -92.08174 | 9/14/2014 0:00 | S | 20250521 | | 1 | 2 | 13 | 1 | 46.81006 | -92.08174 | 9/14/2014 0:01 | NE | 20250521 | | 1 | 3 | 48 | 1 | 46.81006 | -92.08174 | 9/14/2014 0:02 | NE | 20250521 | | 1 | 4 | 30 | 1 | 46.81006 | -92.08174 | 9/14/2014 0:03 | W | 20250521 | | 1 | 5 | 47 | 1 | 46.81006 | -92.08174 | 9/14/2014 0:04 | S | 20250521 | | 1 | 6 | 9 | 1 | 46.81006 | -92.08174 | 9/14/2014 0:05 | S | 20250521 | | 1 | 7 | 53 | 1 | 46.81006 | -92.08174 | 9/14/2014 0:06 | N | 20250521 | | 1 | 8 | 63 | 1 | 46.81006 | -92.08174 | 9/14/2014 0:07 | SW | 20250521 | | 1 | 9 | 4 | 1 | 46.81006 | -92.08174 | 9/14/2014 0:08 | NE | 20250521 | | 1 | 10 | 31 | 1 | 46.81006 | -92.08174 | 9/14/2014 0:09 | N | 20250521 | +------------+------------+------------+------------+------------------+-------------------+------------+------------+------------+AVRO 外部テーブルへのデータの書き込み
INSERT INTO mc_oss_extable_name_avro_pt PARTITION (dt='20250521') VALUES ('1','16','76','1','46.81006','-92.08174','9/14/2014 0:10','SW');書き込まれたデータのクエリ
SELECT * FROM mc_oss_extable_name_avro_pt WHERE dt=20250521;次の結果が返されます:
+------------+------------+------------+------------+------------------+-------------------+------------+------------+------------+ | vehicleid | recordid | patientid | calls | locationlatitute | locationlongtitue | recordtime | direction | dt | +------------+------------+------------+------------+------------------+-------------------+------------+------------+------------+ | 1 | 16 | 76 | 1 | 46.81006 | -92.08174 | 9/14/2014 0:10 | SW | 20250521 | | 1 | 12 | 76 | 1 | 46.81006 | -92.08174 | 9/14/2014 0:10 | SW | 20250521 | | 1 | 1 | 51 | 1 | 46.81006 | -92.08174 | 9/14/2014 0:00 | S | 20250521 | | 1 | 2 | 13 | 1 | 46.81006 | -92.08174 | 9/14/2014 0:01 | NE | 20250521 | | 1 | 3 | 48 | 1 | 46.81006 | -92.08174 | 9/14/2014 0:02 | NE | 20250521 | | 1 | 4 | 30 | 1 | 46.81006 | -92.08174 | 9/14/2014 0:03 | W | 20250521 | | 1 | 5 | 47 | 1 | 46.81006 | -92.08174 | 9/14/2014 0:04 | S | 20250521 | | 1 | 6 | 9 | 1 | 46.81006 | -92.08174 | 9/14/2014 0:05 | S | 20250521 | | 1 | 7 | 53 | 1 | 46.81006 | -92.08174 | 9/14/2014 0:06 | N | 20250521 | | 1 | 8 | 63 | 1 | 46.81006 | -92.08174 | 9/14/2014 0:07 | SW | 20250521 | | 1 | 9 | 4 | 1 | 46.81006 | -92.08174 | 9/14/2014 0:08 | NE | 20250521 | | 1 | 10 | 31 | 1 | 46.81006 | -92.08174 | 9/14/2014 0:09 | N | 20250521 | +------------+------------+------------+------------+------------------+-------------------+------------+------------+------------+