このトピックでは、Object Storage Service (OSS) で RCFILE フォーマットの外部テーブルを作成、読み取り、書き込みする方法について説明します。
前提条件
Alibaba Cloud アカウント、RAM ユーザー、または RAM ロールには、OSS 外部テーブルにアクセスするために必要な権限が必要です。権限付与の詳細については、「OSS の STS 権限付与」をご参照ください。
(オプション) OSS バケット、OSS ディレクトリ、および OSS データファイルを作成済みであること。詳細については、「バケットの作成」、「ディレクトリの管理」、および「簡易アップロード」をご参照ください。
MaxCompute は OSS 内にディレクトリを自動的に作成できます。単一の SQL 文を使用して、外部テーブルと UDF の両方を含む読み取りおよび書き込み操作を実行できます。手動でのディレクトリ作成は不要になりましたが、従来の方法も引き続きサポートされています。
MaxCompute プロジェクトを作成済みであること。詳細については、「MaxCompute プロジェクトの作成」をご参照ください。
MaxCompute は特定のリージョンにのみデプロイされます。リージョン間のデータ接続性の問題を回避するため、MaxCompute プロジェクトと同じリージョンにあるバケットを使用してください。
Alibaba Cloud アカウントまたは RAM ユーザーが、プロジェクトに対する CreateTable 権限を持っていること。テーブル操作の権限の詳細については、「MaxCompute の権限」をご参照ください。
制限事項
クラスタープロパティは OSS 外部テーブルではサポートされていません。
単一ファイルのサイズは 3 GB を超えることはできません。ファイルが 3 GB を超える場合は、分割する必要があります。
サポートされているデータの型
MaxCompute のデータの型の詳細については、「MaxCompute V1.0 データ型エディション」および「MaxCompute 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_rcfile_extable
(
<col_name> <data_type>,
...
)
[COMMENT <table_comment>]
[PARTITIONED BY (<col_name> <data_type>, ...)]
ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.columnar.LazyBinaryColumnarSerDe'
STORED AS rcfile
LOCATION 'oss_location';パラメーター
詳細については、「基本的な構文パラメーター」をご参照ください。
データの書き込み
MaxCompute から OSS にデータを書き込む構文の詳細については、「OSS へのデータの書き込み」をご参照ください。
クエリ分析
SELECT 構文の詳細については、「OSS データの読み取り」をご参照ください。
クエリプランの最適化の詳細については、「クエリの最適化」をご参照ください。
例
この例では、組み込みのオープンソースデータリゾルバーを使用して RCFILE フォーマットの外部テーブルを作成し、OSS のテーブルにデータを書き込み、そのデータをクエリする方法を示します。
データを準備します。
OSS コンソールにログインし、テスト用の RCFILE データファイルを OSS バケットの
oss-mc-test/Demo_rcfile+pt/dt=20250521/ディレクトリにアップロードします。詳細については、「OSS へのファイルのアップロード」をご参照ください。RCFILE 外部テーブルを作成します。
CREATE EXTERNAL TABLE mc_oss_rcfile_extable2_pt ( vehicleId STRING , recordId STRING, patientId STRING, calls STRING, locationLatitute STRING, locationLongtitue STRING, recordTime STRING, direction STRING ) PARTITIONED BY (dt STRING) ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.columnar.LazyBinaryColumnarSerDe' STORED AS rcfile LOCATION 'oss://oss-cn-hangzhou-internal.aliyuncs.com/oss-mc-test/Demo_rcfile+pt/';パーティションデータをインポートします。OSS 外部テーブルがパーティションテーブルの場合、パーティションデータをインポートするために追加のステップを実行する必要があります。詳細については、「OSS 外部テーブルにパーティションデータを追加するための構文」をご参照ください。
-- パーティションデータをインポートします。 MSCK REPAIR TABLE mc_oss_rcfile_extable2_pt ADD PARTITIONS;RCFILE 外部テーブルをクエリします。
SELECT * FROM mc_oss_rcfile_extable2_pt WHERE dt=20250521;RCFILE 外部テーブルにデータを書き込みます。
INSERT INTO TABLE mc_oss_rcfile_extable2_pt PARTITION (dt=20250521) VALUES ('1','13','76','1','46.81006','-92.08174','9/14/2014 0:10','SW');データが書き込まれたことを確認します。
SELECT * FROM mc_oss_rcfile_extable2_pt WHERE dt=20250521 AND recordId='13';