Hologres V4.1 以降では、外部テーブルを作成せずに Object Storage Service (OSS) に保存された構造化データファイルを直接クエリ・インポート・エクスポートできます。このトピックでは、前提条件、構文、パラメーター、使用例、および制限事項について説明します。
概要
EXTERNAL_FILES 関数を使用すると、外部テーブルを作成せずに OSS 内の構造化データファイルをクエリ・インポート・エクスポートできます。以下のシナリオに対応しています。
-
データのクエリ:OSS 内の CSV、Parquet、ORC ファイルをクエリします。
-
データのインポート:OSS から Hologres の内部テーブルへデータをインポートします。
-
データのエクスポート:Hologres テーブルから OSS へデータをエクスポートします。
前提条件
バージョン要件
ご利用の Hologres インスタンスは、V4.1 以降のバージョンである必要があります。それ以前のバージョンをご利用の場合は、スペックアップしてください。詳細については、「Instance upgrades」をご参照ください。
権限の構成
EXTERNAL_FILES を使用できるのは RAM ユーザーまたは Alibaba Cloud アカウントのみです。カスタムアカウントはサポートされていません。EXTERNAL_FILES を使用する前に、以下の手順を完了してください。EXTERNAL_FILES は RAM ロール経由で OSS にアクセスします。まず RAM ロールを作成し、Hologres サービスに付与します。その後、そのロールに OSS 権限を付与します。
ロールの作成
-
RAM Roles で RAM コンソールにログインします。[Roles] ページで、[Create Role] をクリックします。
-
ダイアログボックスで、[Trusted Entity Type] を [Cloud Service]、[Trusted Entity] を [Real-time Data Warehouse Hologres] に設定します。
-
ロール名を入力して、作成を完了します。
OSS アクセス権限の構成
RAM ロールに OSS 権限を付与します。
-
データの読み取り:
AliyunOSSReadOnlyAccess権限を付与します。 -
データの書き込み:
AliyunOSSFullAccess権限を付与します。
SQL ユーザーに GrantAssumeRole 権限を付与
SQL を実行するユーザーが Alibaba Cloud アカウントでない場合、あらかじめ GrantAssumeRole 権限を付与する必要があります。
-
RAM コンソールで権限ポリシーを作成します。[Policies] > [Create Policy] > [Script Editor] に移動し、以下の JSON を貼り付けます。
Role_ARNは、EXTERNAL_FILES で使用するrole_arnと同じ値に置き換えてください。Role ARN の確認方法については、「FAQ about RAM roles and STS tokens」をご参照ください。
{
"Version": "1",
"Statement": [
{
"Effect": "Allow",
"Action": "hologram:GrantAssumeRole",
"Resource": "<RoleARN>"
}
]
}
次に、このポリシーをクエリを実行するユーザーにアタッチします。RAM ユーザーの場合は、[Users] > [Permissions] > [Add Permissions] に移動します。RAM ロールの場合は、[Roles] > [Permissions] > [Add Permissions] に移動します。
構文
データのクエリ
SELECT * FROM EXTERNAL_FILES(
path = 'oss://bucket/path',
format = 'csv|parquet|orc',
oss_endpoint = 'oss_endpoint',
role_arn = 'acs:ram::xxx:role/xxx'
[, other parameters...]
) [AS (col1 type1, col2 type2, ...)]
データのインポート
INSERT INTO target_table
SELECT * FROM EXTERNAL_FILES(
path = 'oss://bucket/path',
format = 'csv|parquet|orc',
oss_endpoint = 'oss_endpoint',
role_arn = 'acs:ram::xxx:role/xxx'
[, other parameters...]
) [AS (col1 type1, col2 type2, ...)]
データのエクスポート
INSERT INTO EXTERNAL_FILES(
path = 'oss://bucket/path',
format = 'csv',
oss_endpoint = 'oss_endpoint',
role_arn = 'acs:ram::xxx:role/xxx'
[, other parameters...]
) SELECT * FROM source_table;
パラメーター
共通パラメーター
|
パラメーター |
説明 |
必須 |
例 |
|
|
ファイルパス。ディレクトリおよびファイルを指定できます。複数のパスをカンマ区切りで指定可能です。 |
はい |
|
|
|
ファイル形式。クエリ時は |
はい |
|
|
|
OSS クラシックネットワークエンドポイント。詳細については、「Regions and endpoints」をご参照ください。 |
いいえ |
|
|
|
Alibaba Cloud RAM ロールの ARN。 |
いいえ |
|
読み取りパラメーター
|
パラメーター名 |
説明 |
必須 |
例 |
|
|
スキーマ推論時にスキャンするファイルの最大数。デフォルト値:5。 |
いいえ |
|
|
|
スキーマ推論時のファイルスキャン順序。デフォルト値:latest_first。 |
いいえ |
|
|
|
CSV ファイルの先頭行をテーブルヘッダーとしてスキップするかどうか。デフォルト値: |
いいえ |
|
|
|
CSV ファイルの列区切り文字。デフォルト値:カンマ。 |
いいえ |
|
書き込みパラメーター
|
パラメーター名 |
説明 |
必須 |
例 |
|
|
各出力ファイルのサイズ(MB 単位)。デフォルト値:10。 |
いいえ |
|
|
|
すべてのデータを単一ファイルに書き込むかどうか。デフォルト値: |
いいえ |
|
使用例
例 1:CSV ファイルのクエリ
OSS 内の CSV ファイルをクエリし、スキーマを自動推論します。
SELECT * FROM EXTERNAL_FILES(
path = 'oss://mybucket/data/',
format = 'csv',
csv_skip_header = 'true',
csv_delimiter = ',',
oss_endpoint = 'oss-cn-hangzhou-internal.aliyuncs.com',
role_arn = 'acs:ram::123456789:role/hologres-role'
);
CSV ファイルをクエリし、スキーマを手動で指定します。
SELECT * FROM EXTERNAL_FILES(
path = 'oss://mybucket/data/',
format = 'csv',
csv_skip_header = 'true',
oss_endpoint = 'oss-cn-hangzhou-internal.aliyuncs.com',
role_arn = 'acs:ram::123456789:role/hologres-role'
) AS (id int, name text, amount decimal(10,2));
例 2:Parquet ファイルのクエリ
SELECT * FROM EXTERNAL_FILES(
path = 'oss://mybucket/parquet_data/',
format = 'parquet',
oss_endpoint = 'oss-cn-hangzhou-internal.aliyuncs.com',
role_arn = 'acs:ram::123456789:role/hologres-role'
);
例 3:ORC ファイルのクエリ
SELECT * FROM EXTERNAL_FILES(
path = 'oss://mybucket/orc_data/',
format = 'orc',
oss_endpoint = 'oss-cn-hangzhou-internal.aliyuncs.com',
role_arn = 'acs:ram::123456789:role/hologres-role'
);
例 4:Hologres テーブルへのデータインポート
-- 対象テーブルの作成
CREATE TABLE orders (
order_id int,
customer_name text,
amount decimal(10,2),
PRIMARY KEY(order_id)
);
-- OSS からのデータインポート
INSERT INTO orders
SELECT * FROM EXTERNAL_FILES(
path = 'oss://mybucket/orders/',
format = 'csv',
csv_skip_header = 'true',
oss_endpoint = 'oss-cn-hangzhou-internal.aliyuncs.com',
role_arn = 'acs:ram::123456789:role/hologres-role'
) AS (order_id int, customer_name text, amount decimal(10,2));
例 5:OSS へのデータエクスポート
複数ファイルにデータをエクスポートします。
INSERT INTO EXTERNAL_FILES(
path = 'oss://mybucket/export/',
format = 'csv',
oss_endpoint = 'oss-cn-hangzhou-internal.aliyuncs.com',
role_arn = 'acs:ram::123456789:role/hologres-role',
target_file_size_mb = '100'
) SELECT * FROM orders;
単一ファイルにデータをエクスポートします。
INSERT INTO EXTERNAL_FILES(
path = 'oss://mybucket/export/',
format = 'csv',
oss_endpoint = 'oss-cn-hangzhou-internal.aliyuncs.com',
role_arn = 'acs:ram::123456789:role/hologres-role',
single_file = 'true'
) SELECT * FROM orders;
例 6:サーバーレスリソースグループの使用
SET hg_computing_resource = 'serverless';
SELECT * FROM EXTERNAL_FILES(
path = 'oss://mybucket/data/',
format = 'csv',
oss_endpoint = 'oss-cn-hangzhou-internal.aliyuncs.com',
role_arn = 'acs:ram::123456789:role/hologres-role'
);
スキーマ推論ルール
自動スキーマ推論
AS 句でスキーマを指定しない場合、Hologres は自動的にスキーマを推論します。
-
Parquet/ORC:ファイルメタデータから推論します。
-
ヘッダー付き CSV:先頭行(ヘッダー)とデータ内容から推論します。
-
ヘッダーなし CSV:すべてのファイルが同一のスキーマを持つ必要があります。
Hologres は schema_deduce_file_num で指定された数のファイルをスキャンし、すべてのスキーマの和集合を取得します。
スキーマ推論動作
|
シナリオ |
動作 |
|
スキーマに存在するがファイルに存在しないカラム |
NULL で埋める |
|
ファイルのカラムがスキーマに存在しません。 |
カラムを無視 |
|
カラム型が一致しないが変換可能な場合 |
自動型変換 |
|
カラム型が一致せず変換不可能な場合 |
NULL を返す |
型マッピング
EXTERNAL_FILES が ORC または Parquet ファイルを読み取る際、ファイル内の型を PostgreSQL 型にマッピングします。以下にマッピングを示します。サポートされていない型は各表の下に記載されています。
ORC 型マッピング
ORC 型 |
PostgreSQL 型 |
|---|---|
BOOLEAN | BOOLEAN |
TINYINT / SMALLINT | SMALLINT |
INT | INTEGER |
BIGINT | BIGINT |
FLOAT | REAL |
DOUBLE | DOUBLE PRECISION |
DECIMAL(p, s) | DECIMAL(p, s) |
STRING | TEXT |
VARCHAR(n) | VARCHAR(n) |
CHAR(n) | CHAR(n) |
BINARY | BYTEA |
DATE | DATE |
TIMESTAMP | TIMESTAMP WITHOUT TIME ZONE |
TIMESTAMP WITH LOCAL TIMEZONE | TIMESTAMP WITH TIME ZONE |
LIST | 配列 (pg_type[]) |
ORC 型の UNION、STRUCT、および MAP はサポートされていません。
Parquet 型マッピング
Parquet 物理型 |
Parquet 論理型 |
PostgreSQL 型 |
|---|---|---|
BOOLEAN | — | BOOLEAN |
INT32 | — | INTEGER |
INT32 | DATE | DATE |
INT32 | DECIMAL(p, s) | DECIMAL(p, s) |
INT64 | — | BIGINT |
INT64 | TIMESTAMP_MILLIS / MICROS | TIMESTAMP / TIMESTAMPTZ |
INT64 | DECIMAL(p, s) | DECIMAL(p, s) |
FLOAT | — | REAL |
DOUBLE | — | DOUBLE PRECISION |
BYTE_ARRAY | — | BYTEA |
BYTE_ARRAY | STRING | TEXT |
BYTE_ARRAY | JSON / BSON | JSONB |
BYTE_ARRAY | ENUM | TEXT |
FIXED_LEN_BYTE_ARRAY | DECIMAL(p, s) | DECIMAL(p, s) |
FIXED_LEN_BYTE_ARRAY | UUID | UUID |
LIST | LIST | 配列 (pg_type[]) |
Parquet 型の STRUCT および MAP はサポートされていません。
制限事項
-
エクスポートフォーマット:エクスポート時は CSV のみをサポートします。
-
再帰検索:サブディレクトリは再帰的に検索されません。
-
サポート外の型:ORC 型の UNION、STRUCT、MAP。Parquet 型の STRUCT、MAP。
よくある質問
Q:データをエクスポートする際に権限エラーが発生しました。どうすればよいですか?
A:RAM ロールに AliyunOSSFullAccess 権限が付与されていることを確認してください。
Q:エクスポートされるファイルのサイズを制御するにはどうすればよいですか?
A:target_file_size_mb パラメーターを使用して各ファイルのサイズを設定します。より細かい制御が必要な場合は、hg_experimental_query_batch_size パラメーターを調整してください。