本トピックでは、SEQUENCEFILE フォーマットの OSS 外部テーブルを作成、読み取り、書き込みする方法について説明します。
適用範囲
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 [IF NOT EXISTS] <mc_oss_extable_name>
(
<col_name> <data_type>,
...
)
[COMMENT <table_comment>]
[PARTITIONED BY (<col_name> <data_type>)]
STORED AS sequencefile
LOCATION '<oss_location>';パラメーター
詳細については、「基本的な構文パラメーター」をご参照ください。
データの書き込み
MaxCompute から OSS にデータを書き込む構文の詳細については、「OSS へのデータの書き込み」をご参照ください。
データのクエリと分析
SELECT 構文の詳細については、「OSS からのデータの読み取り」をご参照ください。
クエリプランの最適化の詳細については、「クエリの最適化」をご参照ください。
例
この例では、組み込みのオープンソースデータパーサを使用して SEQUENCEFILE 形式の外部テーブルを作成し、OSS にデータを書き込み、そのデータをクエリする方法を示します。
前提条件
OSS バケットとフォルダが利用可能であること。詳細については、「バケットの作成」および「フォルダの管理」をご参照ください。
MaxCompute は OSS でのフォルダの自動作成をサポートしています。SQL 文に外部テーブルとユーザー定義関数 (UDF) が含まれている場合、単一の文を使用してテーブルの読み書きと UDF の使用が可能です。フォルダは手動で作成することもできます。
MaxCompute は特定のリージョンにのみデプロイされます。リージョン間のデータ接続に関する潜在的な問題を回避するため、ご利用の OSS バケットがご利用の MaxCompute プロジェクトと同じリージョンにあることを確認してください。
権限付与
OSS にアクセスするための権限が必要です。Alibaba Cloud アカウント、Resource Access Management (RAM) ユーザー、または RAM ロールを使用して OSS 外部テーブルにアクセスできます。権限付与の詳細については、「STS モードでの OSS へのアクセス権限付与」をご参照ください。
MaxCompute プロジェクトで `CreateTable` 権限が必要です。テーブル権限の詳細については、「MaxCompute の権限」をご参照ください。
テストデータのアップロード
OSS コンソールにログインし、テストデータファイル 20250611TableSink をご利用の OSS バケットの
external-table-test/sequence/dt=20250521/フォルダにアップロードします。詳細については、「OSS へのファイルのアップロード」をご参照ください。SEQUENCEFILE テーブルの作成
CREATE EXTERNAL TABLE mc_oss_extable_name_sequencefile1_pt ( vehicleId STRING , recordId STRING, patientId STRING, calls STRING, locationLatitute STRING, locationLongtitue STRING, recordTime string, direction string ) PARTITIONED BY (dt STRING) STORED AS sequencefile LOCATION 'oss://oss-cn-hangzhou-internal.aliyuncs.com/external-table-test/sequence/';パーティションデータのインポート。作成した OSS 外部テーブルがパーティションテーブルの場合、追加のコマンドを実行してパーティションデータをインポートする必要があります。詳細については、「OSS 外部テーブルにパーティションデータを追加するための構文」をご参照ください。
-- パーティションデータをインポートします。 MSCK REPAIR TABLE mc_oss_extable_name_sequencefile1_pt ADD PARTITIONS;SEQUENCEFILE テーブルからのデータの読み取り
SELECT * FROM mc_oss_extable_name_sequencefile1_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 | +------------+------------+------------+------------+------------------+-------------------+------------+------------+------------+SEQUENCEFILE テーブルへのデータの書き込み
INSERT INTO mc_oss_extable_name_sequencefile1_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_sequencefile1_pt WHERE dt=20250521 AND recordId='16';次の結果が返されます:
+------------+------------+------------+------------+------------------+-------------------+------------+------------+------------+ | vehicleid | recordid | patientid | calls | locationlatitute | locationlongtitue | recordtime | direction | dt | +------------+------------+------------+------------+------------------+-------------------+------------+------------+------------+ | 1 | 16 | 76 | 1 | 46.81006 | -92.08174 | 9/14/2014 0:10 | SW | 20250521 | +------------+------------+------------+------------+------------------+-------------------+------------+------------+------------+