全部產品
Search
文件中心

Hologres:檔案讀取函數(EXTERNAL_FILES)

更新時間:Feb 06, 2026

自 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;

參數說明

通用參數

參數名

說明

是否必填

樣本

path

檔案路徑,支援目錄和檔案;可指定多個路徑(逗號分隔);支援 ?(任意單字元)和 *(零個或多個字元)萬用字元。

oss://bucket/dir/oss://bucket/dir/*.csv

format

檔案格式。查詢支援 csvparquetorc;匯出僅支援 csv

csv

oss_endpoint

OSS 傳統網路訪問網域名稱,詳見OSS 地區與端點

oss-cn-hangzhou-internal.aliyuncs.com

role_arn

阿里雲 RAM 角色的 ARN。

acs:ram::xxx:role/xxx

讀取參數

參數名

說明

是否必填

樣本

schema_deduce_file_num

推斷 Schema 時讀取的最大檔案數,預設 5。

10

schema_deduce_file_order

推斷 Schema 時檔案的排列順序,預設新檔案在前。

latest_firstearliest_firstrandom

csv_skip_header

是否跳過 CSV 首行(作為表頭),預設 false

true

csv_delimiter

CSV 資料行分隔符號,預設為逗號。

|

寫入參數

參數名

說明

是否必填

樣本

target_file_size_mb

單個輸出檔案大小(MB),預設 10。

500

single_file

是否唯寫入單個檔案,預設 false

true

使用樣本

樣本 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 的 UNIONSTRUCTMAP 類型不支援。

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 的 STRUCTMAP 類型不支援。

使用限制

  • 匯出格式:目前置出僅支援 CSV 格式。

  • 遞迴尋找:不支援遞迴尋找子目錄。

  • 不支援的類型:ORC 的 UNION/STRUCT/MAP、Parquet 的 STRUCT/MAP 不支援。

常見問題

Q:匯出資料時提示許可權不足怎麼辦?

A:請確保 RAM 角色已授予 AliyunOSSFullAccess 許可權。

Q:如何控制匯出檔案的大小?

A:使用 target_file_size_mb 參數指定單個檔案大小。如需更精細控制,可調整 hg_experimental_query_batch_size 參數。