自 Hologres V4.1 版本起,支援通過 EXTERNAL_FILES 函數直接查詢、匯入和匯出 OSS(Object Storage Service服務)上的結構化資料檔案,無需建立外部表格。本文介紹使用前提、文法、參數、樣本及使用限制。
概述
EXTERNAL_FILES 函數用於直接查詢、匯入和匯出 OSS 上的結構化資料檔案,無需建立外部表格即可進行資料操作。主要支援以下情境:
-
資料查詢:直接查詢 OSS 上的 CSV、Parquet、ORC 格式檔案。
-
資料匯入:將 OSS 上的資料匯入到 Hologres 內表。
-
資料匯出:將 Hologres 表中的資料匯出到 OSS。
使用前提
版本要求
執行個體需為 Hologres V4.1 及以上版本。若執行個體為 V4.1 以下版本,請參見執行個體升級。
許可權配置
EXTERNAL_FILES 僅支援 RAM 子帳號或主帳號使用,暫不支援自訂帳號。使用前需完成以下配置:EXTERNAL_FILES 通過 RAM 角色訪問 OSS,因此需先建立角色並授權給 Hologres 服務,再為角色授予 OSS 相關許可權。
建立角色
-
登入阿里雲 RAM 存取控制管控台,進入角色列表,點擊建立角色。
-
在彈窗中選擇信任主體類型為「雲端服務」,信任主體名稱選擇「即時數倉 Hologres」。
-
填寫角色名稱並完成建立。
配置 OSS 存取權限
為 RAM 角色配置 OSS 許可權:
-
讀取資料:授予
AliyunOSSReadOnlyAccess許可權。 -
寫入資料:授予
AliyunOSSFullAccess許可權。
授予運行 SQL 的使用者 GrantAssumeRole 許可權
若執行使用者非主帳號,需先授予該使用者 GrantAssumeRole 許可權:
-
在 RAM 存取控制中建立權限原則(權限原則 → 建立權限原則 → 指令碼編輯),粘貼以下內容,其中
Role_ARN需與 EXTERNAL_FILES 使用的role_arn相同。如何尋找 Role_ARN 請參見RAM 角色與 STS 常見問題。
{
"Version": "1",
"Statement": [
{
"Effect": "Allow",
"Action": "hologram:GrantAssumeRole",
"Resource": "<RoleARN>"
}
]
}
然後將該策略授權給執行查詢的使用者(RAM 使用者:使用者 → 許可權管理 → 新增授權;RAM 角色:角色 → 許可權管理 → 新增授權)。
文法說明
查詢資料
SELECT * FROM EXTERNAL_FILES(
path = 'oss://bucket/path',
format = 'csv|parquet|orc',
oss_endpoint = 'oss_endpoint',
role_arn = 'acs:ram::xxx:role/xxx'
[, 其他參數...]
) [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'
[, 其他參數...]
) [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'
[, 其他參數...]
) SELECT * FROM source_table;
參數說明
通用參數
|
參數名 |
說明 |
是否必填 |
樣本 |
|
|
檔案路徑,支援目錄和檔案;可指定多個路徑(逗號分隔);支援 |
是 |
|
|
|
檔案格式。查詢支援 |
是 |
|
|
|
OSS 傳統網路訪問網域名稱,詳見OSS 地區與端點。 |
否 |
|
|
|
阿里雲 RAM 角色的 ARN。 |
否 |
|
讀取參數
|
參數名 |
說明 |
是否必填 |
樣本 |
|
|
推斷 Schema 時讀取的最大檔案數,預設 5。 |
否 |
|
|
|
推斷 Schema 時檔案的排列順序,預設新檔案在前。 |
否 |
|
|
|
是否跳過 CSV 首行(作為表頭),預設 |
否 |
|
|
|
CSV 資料行分隔符號,預設為逗號。 |
否 |
|
寫入參數
|
參數名 |
說明 |
是否必填 |
樣本 |
|
|
單個輸出檔案大小(MB),預設 10。 |
否 |
|
|
|
是否唯寫入單個檔案,預設 |
否 |
|
使用樣本
樣本 1:查詢 CSV 檔案
查詢 OSS 上的 CSV 檔案,自動推斷 Schema:
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 檔案,手動指定 Schema:
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:使用 Serverless 資源群組
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'
);
Schema 推斷規則
自動推斷 Schema
當不使用 AS 子句指定 Schema 時,系統會自動推斷:
-
Parquet/ORC:根據檔案中繼資料自動推斷。
-
帶表頭的 CSV:根據首行表頭及資料內容推斷。
-
不帶表頭的 CSV:要求所有檔案 Schema 一致。
推斷時會掃描 schema_deduce_file_num 指定數量的檔案,取所有檔案 Schema 的並集。
Schema 推斷行為
|
情境 |
處理方式 |
|
Schema 中的列在檔案中不存在 |
自動填滿 NULL |
|
檔案中的列在 Schema 中不存在 |
自動忽略該列 |
|
列類型不符但可轉換 |
自動類型轉換 |
|
列類型不符且無法轉換 |
返回 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 參數。