Mulai dari Hologres V4.1, Anda dapat menggunakan fungsi EXTERNAL_FILES untuk langsung melakukan kueri, impor, dan ekspor file data terstruktur yang disimpan di Object Storage Service (OSS) tanpa membuat tabel eksternal. Topik ini menjelaskan prasyarat, sintaksis, parameter, contoh, dan batasan.
Ikhtisar
Fungsi EXTERNAL_FILES memungkinkan Anda melakukan kueri, impor, dan ekspor file data terstruktur di OSS tanpa membuat tabel eksternal. Fungsi ini mendukung skenario berikut:
-
Kueri data: Lakukan kueri terhadap file CSV, Parquet, dan ORC di OSS.
-
Impor data: Impor data dari OSS ke tabel internal Hologres.
-
Ekspor data: Ekspor data dari tabel Hologres ke OSS.
Prasyarat
Persyaratan versi
Instans Hologres Anda harus menjalankan versi V4.1 atau yang lebih baru. Jika instans Anda menggunakan versi sebelumnya, lakukan upgrade. Untuk informasi selengkapnya, lihat Instance upgrades.
Konfigurasi izin
Hanya Pengguna RAM atau Akun Alibaba Cloud yang dapat menggunakan EXTERNAL_FILES. Akun kustom tidak didukung. Sebelum menggunakan EXTERNAL_FILES, selesaikan langkah-langkah berikut. EXTERNAL_FILES mengakses OSS melalui Peran RAM. Pertama, buat Peran RAM dan berikan kepada layanan Hologres. Kemudian, berikan izin OSS kepada peran tersebut.
Buat peran
-
Masuk ke Konsol RAM di RAM Roles. Buka halaman Roles dan klik Create Role.
-
Pada kotak dialog, atur Trusted Entity Type ke Cloud Service dan Trusted Entity ke Real-time Data Warehouse Hologres.
-
Masukkan nama peran dan selesaikan pembuatan.
Konfigurasi izin akses OSS
Berikan izin OSS kepada Peran RAM:
-
Baca data: Berikan izin
AliyunOSSReadOnlyAccess. -
Tulis data: Berikan izin
AliyunOSSFullAccess.
Berikan izin GrantAssumeRole kepada pengguna SQL
Jika pengguna yang menjalankan SQL bukan Akun Alibaba Cloud, berikan izin GrantAssumeRole terlebih dahulu:
-
Di Konsol RAM, buat kebijakan izin. Buka Policies > Create Policy > Script Editor. Tempel JSON berikut. Ganti
Role_ARNdenganrole_arnyang sama yang digunakan di EXTERNAL_FILES. Untuk menemukan Role ARN, lihat FAQ about RAM roles and STS tokens.
{
"Version": "1",
"Statement": [
{
"Effect": "Allow",
"Action": "hologram:GrantAssumeRole",
"Resource": "<RoleARN>"
}
]
}
Kemudian, sambungkan kebijakan ini ke pengguna yang menjalankan kueri. Untuk Pengguna RAM, buka Users > Permissions > Add Permissions. Untuk Peran RAM, buka Roles > Permissions > Add Permissions.
Sintaksis
Kueri data
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, ...)]
Impor data
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, ...)]
Ekspor data
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;
Parameter
Parameter umum
|
Parameter |
Deskripsi |
Wajib |
Contoh |
|
|
Jalur file. Mendukung direktori dan file. Anda dapat menentukan beberapa jalur yang dipisahkan koma. Mendukung wildcard |
Ya |
|
|
|
Format file. Untuk kueri, mendukung |
Ya |
|
|
|
Titik akhir jaringan klasik OSS. Untuk informasi selengkapnya, lihat Regions and endpoints. |
Tidak |
|
|
|
ARN dari Peran RAM Alibaba Cloud. |
Tidak |
|
Parameter baca
|
Nama Parameter |
Deskripsi |
Wajib |
Contoh |
|
|
Jumlah maksimum file yang dipindai saat melakukan inferensi skema. Default: 5. |
Tidak |
|
|
|
Urutan pemindaian file untuk inferensi skema. Default: latest_first. |
Tidak |
|
|
|
Apakah baris pertama file CSV dilewati sebagai header tabel. Default: |
Tidak |
|
|
|
Pemisah kolom untuk file CSV. Default: koma. |
Tidak |
|
Parameter tulis
|
Nama parameter |
Deskripsi |
Wajib |
Contoh |
|
|
Ukuran setiap file output dalam MB. Default: 10. |
Tidak |
|
|
|
Apakah semua data ditulis ke satu file. Default: |
Tidak |
|
Contoh
Contoh 1: Kueri file CSV
Lakukan kueri terhadap file CSV di OSS dan inferensi skema secara otomatis:
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'
);
Lakukan kueri terhadap file CSV dan tentukan skema secara manual:
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));
Contoh 2: Kueri file 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'
);
Contoh 3: Kueri file 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'
);
Contoh 4: Impor data ke tabel Hologres
-- Buat tabel target
CREATE TABLE orders (
order_id int,
customer_name text,
amount decimal(10,2),
PRIMARY KEY(order_id)
);
-- Impor data dari 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));
Contoh 5: Ekspor data ke OSS
Ekspor data ke beberapa file:
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;
Ekspor data ke satu file:
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;
Contoh 6: Gunakan kelompok sumber daya arsitektur tanpa server
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'
);
Aturan inferensi skema
Inferensi skema otomatis
Jika Anda tidak menentukan skema menggunakan klausa AS, Hologres akan melakukan inferensi skema secara otomatis:
-
Parquet/ORC: Inferensi dari metadata file.
-
CSV dengan header: Inferensi dari baris pertama (header) dan konten data.
-
CSV tanpa header: Semua file harus memiliki skema yang identik.
Hologres memindai jumlah file yang ditentukan oleh parameter schema_deduce_file_num dan menggabungkan semua skema yang ditemukan.
Perilaku inferensi skema
|
Skenario |
Tindakan |
|
Kolom dalam skema tidak ada di file |
Isi dengan NULL |
|
Kolom dalam file tidak ada di skema |
Abaikan kolom tersebut |
|
Tipe kolom tidak cocok tetapi dapat dikonversi |
Konversi Tipe Otomatis |
|
Tipe kolom tidak cocok dan tidak dapat dikonversi |
Kembalikan NULL |
Pemetaan tipe
Saat EXTERNAL_FILES membaca file ORC atau Parquet, tipe data dalam file tersebut dipetakan ke tipe PostgreSQL. Pemetaan tersebut tercantum di bawah ini. Tipe yang tidak didukung dicantumkan setelah setiap tabel.
Pemetaan tipe ORC
Tipe ORC |
Tipe 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 | Array (pg_type[]) |
Tipe ORC UNION, STRUCT, dan MAP tidak didukung.
Pemetaan tipe Parquet
Tipe fisik Parquet |
Tipe logis Parquet |
Tipe 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 | Array (pg_type[]) |
Tipe Parquet STRUCT dan MAP tidak didukung.
Batasan
-
Format ekspor: Hanya CSV yang didukung untuk ekspor.
-
Pencarian rekursif: Subdirektori tidak dicari secara rekursif.
-
Tipe yang tidak didukung: Tipe ORC UNION, STRUCT, dan MAP; serta tipe Parquet STRUCT dan MAP.
FAQ
T: Saya mendapatkan error izin saat mengekspor data. Apa yang harus saya lakukan?
J: Pastikan Peran RAM memiliki izin AliyunOSSFullAccess.
T: Bagaimana cara mengontrol ukuran file yang diekspor?
J: Gunakan parameter target_file_size_mb untuk mengatur ukuran setiap file. Untuk kontrol yang lebih rinci, sesuaikan parameter hg_experimental_query_batch_size.