Mulai Hologres V3.1, Anda dapat memanggil fungsi yang ditentukan pengguna (UDF) di Function Compute secara jarak jauh untuk memproses logika bisnis kompleks atau melakukan operasi data tingkat lanjut. Topik ini menjelaskan cara menggunakan UDF di Hologres.
Ikhtisar
Fitur Fungsi Jarak Jauh memungkinkan pengembang memperluas kemampuan pemrosesan dan analisis data dengan mengintegrasikan fungsi eksternal ke dalam Hologres. Di Hologres V3.1, fitur ini mendukung pemanggilan Alibaba Cloud Function Compute. Fitur ini memungkinkan Anda secara dinamis memanggil Function Compute untuk memproses logika bisnis kompleks atau melakukan operasi data tingkat lanjut saat menanyakan data Hologres.
Dengan Fungsi Jarak Jauh, Anda dapat menerapkan tiga skenario berikut:
Pemrosesan data real-time: Memanggil fungsi eksternal secara dinamis untuk melakukan pembersihan data, konversi format, atau perhitungan kompleks saat menanyakan data.
Integrasi layanan pihak ketiga: Gunakan Function Compute untuk mengaktifkan interaksi antara data Hologres dan layanan Alibaba Cloud lainnya atau API pihak ketiga.
Analitik tingkat lanjut: Gunakan Function Compute untuk mengimplementasikan algoritma analitik tingkat lanjut seperti inferensi model dan pembelajaran mesin, serta menulis hasil langsung kembali ke Hologres.
Prasyarat
Sebuah instance Hologres versi 3.1 atau lebih baru telah dibeli. Untuk informasi lebih lanjut, lihat Beli instance Hologres.
Function Compute V3.0 telah diaktifkan. Anda dapat masuk ke Konsol Function Compute untuk melakukan operasi.
Peran terkait layanan
AliyunServiceRoleForHologresRemoteUDFtelah dibuat.Masuk ke Konsol Hologres, dan klik Create a Service-linked Role di panel navigasi sisi kiri.
Pilih
AliyunServiceRoleForHologresRemoteUDF, dan klik Authorize Now untuk menyelesaikan otorisasi.
Instance Hologres dan layanan Function Compute harus berada di wilayah yang sama.
Anda perlu mengaktifkan Alibaba Cloud Function Compute, serta mengembangkan dan menyebarkan fungsi untuk dipanggil oleh Hologres. Untuk informasi lebih lanjut, lihat Pengembangan kode.
Peringatan
Hanya fungsi UDF skalar dan fungsi tabel bernilai pengguna (UDTF) yang didukung. Fungsi agregat yang ditentukan pengguna (UDAF) tidak didukung.
Hanya tipe data berikut dan tipe array yang sesuai yang didukung:
BOOLEAN,INTEGER,BIGINT,REAL,DOUBLE PRECISION, danTEXT.Fungsi Jarak Jauh tidak mendukung parameter input konstan.
Fitur ini membebankan biaya di Function Compute. Untuk informasi lebih lanjut, lihat Penagihan.
Fitur ini tidak membebankan biaya tambahan di Hologres.
Kelola UDF
Buat ekstensi
Sebelum menggunakan fitur ini untuk pertama kali, Anda perlu mengeksekusi pernyataan berikut untuk membuat ekstensi:
CREATE EXTENSION [ IF NOT EXISTS ] function_compute;Buat fungsi
Sintaks
CREATE [ OR REPLACE ] FUNCTION <function_name>
( [ [ argmode ] [ argname ] <argtype> [ { DEFAULT | = } default_expr ] [, ...] ] )
[ RETURNS [SETOF] rettype | RETURNS TABLE ( column_name column_type) ]
LANGUAGE function_compute
AS '<fc_endpoint>/<func_name>'
{
{ CALLED ON NULL INPUT | RETURNS NULL ON NULL INPUT | STRICT }
| SET function_compute.qualifier TO <qualifier>
| SET function_compute.compression TO <compression>
| SET function_compute.max_batch_size TO <max_batch_size>
} ...Parameter
Kategori Parameter | Parameter | Wajib | Deskripsi |
Nama Fungsi | function_name | Ya | Nama fungsi.
|
Parameter Fungsi | argtype | Ya | Tipe data parameter. |
argmode | Tidak | Mendukung IN, OUT, dan INOUT. Nilai default adalah IN. Untuk menghindari ambiguitas, tidak disarankan menggunakan INOUT. Selain itu, hanya satu parameter OUT atau satu parameter INOUT yang dapat disertakan. | |
argname | Tidak | Nama parameter.
| |
default_expr | Tidak | Nilai default, hanya untuk parameter input. Jika nilai default ditentukan untuk suatu parameter, semua parameter berikutnya juga harus memiliki nilai default. | |
Endpoint Function Compute | LANGUAGE function_compute | Ya | Nilai tetap, yang mendeklarasikan penggunaan Function Compute. |
fc_endpoint | Ya | Endpoint internal Function Compute. Untuk informasi lebih lanjut, lihat Endpoint. | |
func_name | Ya | Nama fungsi target. (Fungsi harus dibuat di konsol Function Compute terlebih dahulu). | |
Tipe Pengembalian | rettype | Tidak | Tipe nilai pengembalian. Ketika parameter OUT atau INOUT ada, klausa RETURNS dapat dihilangkan. Jika klausa ini ada, itu harus konsisten dengan tipe hasil yang tersirat oleh parameter output. |
column_name | Tidak | Nama kolom keluaran dalam sintaks RETURNS TABLE. Ini adalah cara lain untuk mendeklarasikan parameter OUT bernama. Perbedaannya adalah RETURNS TABLE juga menyiratkan RETURNS SETOF (mengembalikan set). | |
column_type | Tidak | Tipe data kolom keluaran dalam sintaks RETURNS TABLE. | |
Strategi Penanganan NULL | CALLED ON NULL INPUT | Tidak | Perilaku default. NULL dapat terkandung dalam input, dan fungsi perlu menangani logika nilai NULL. |
RETURNS NULL ON NULL INPUT | Tidak | NULL langsung dikembalikan jika ada input yang NULL. | |
STRICT | Tidak | Alias untuk RETURNS NULL ON NULL INPUT. | |
Versi Fungsi | qualifier | Tidak | Menentukan versi fungsi atau alias untuk dipanggil. Nilai default adalah |
Algoritma kompresi permintaan | compression | Tidak | Menentukan algoritma kompresi yang digunakan dalam permintaan dan respons saat fungsi dipanggil. Nilai valid:
|
Ukuran batch maksimum per permintaan | max_batch_size | Tidak | Menentukan jumlah baris maksimum yang dikirim ke Function Compute per batch. Tujuan utamanya adalah untuk menetapkan batas atas jumlah baris untuk pemrosesan batch untuk fungsi Function Compute dengan keterbatasan memori atau kendala lainnya. Jika parameter ini tidak ditentukan secara eksplisit, Hologres akan secara otomatis menghitung dan menggunakan ukuran batch optimal, biasanya tanpa memerlukan intervensi manual. |
Contoh
Buat UDF skalar.
CREATE OR REPLACE FUNCTION rf_add ( a INTEGER, b INTEGER DEFAULT 1 ) RETURNS BIGINT LANGUAGE function_compute AS 'xxxxxxxxxxxxx.cn-shanghai-internal.fc.aliyuncs.com/add' ;Buat UDTF.
-- Form 1 CREATE OR REPLACE FUNCTION rf_unnest(TEXT []) RETURNS TABLE (item TEXT ) LANGUAGE function_compute AS 'xxxxxxxxxxxxxx.cn-hangzhou-internal.fc.aliyuncs.com/unnest' STRICT SET function_compute.max_batch_size TO 1024; -- Form 2 CREATE OR REPLACE FUNCTION rf_unnest(TEXT []) RETURNS SETOF TEXT LANGUAGE function_compute AS 'xxxxxxxxxxxxxx.cn-hangzhou-internal.fc.aliyuncs.com/unnest' STRICT SET function_compute.max_batch_size TO 1024;
Lihat fungsi
Lihat fungsi jarak jauh yang telah dibuat.
SELECT
CASE
WHEN p.proretset = 'f' THEN 'scalar UDF'
WHEN p.proretset = 't' THEN 'UDTF'
END AS function_type,
n.nspname AS schema_name,
p.proname AS function_name,
pg_get_function_arguments(p.oid) AS arguments,
pg_get_function_result(p.oid) AS return_type,
p.proisstrict AS is_strict,
p.proconfig AS config,
pg_get_functiondef(p.oid) AS definition
FROM
pg_proc p
JOIN pg_language l ON p.prolang = l.oid
JOIN pg_namespace n ON p.pronamespace = n.oid
WHERE
l.lanname = 'function_compute'
AND p.prokind != 'p'
ORDER BY
function_type,
schema_name,
function_name;Hapus fungsi
Sintaks
DROP FUNCTION [ IF EXISTS ] <function_name> [ ( [ [ argmode ] [ argname ] <argtype> [, ...] ] ) ] [, ...]Parameter
Parameter | Wajib | Deskripsi |
function_name | Ya | Nama fungsi yang akan dihapus. |
argtype | Ya | Tipe data parameter. |
argmode | Tidak | Mendukung IN, OUT, dan INOUT. Default adalah IN. Untuk menghindari ambiguitas, tidak disarankan menggunakan INOUT. Selain itu, hanya satu parameter OUT atau satu parameter INOUT yang dapat disertakan. |
argname | Tidak | Nama parameter. Untuk parameter input, ini hanya berfungsi untuk tujuan dokumentasi. Untuk parameter output, ini menentukan nama kolom dari set hasil yang dikembalikan. Jika dihilangkan, sistem akan menghasilkan nama default. |
Contoh
DROP FUNCTION rf_add(INTEGER, INTEGER);Format interaksi data
Format permintaan dari Hologres ke Function Compute
Hologres memanggil antarmuka InvokeFunction Function Compute melalui POST. Badan permintaan dalam format JSON, dengan level teratasnya adalah objek. Saat ini, hanya berisi kunci bernama data, yang nilainya adalah array dua dimensi. Setiap elemen dalam array sesuai dengan satu baris data dalam batch, berisi parameter yang diperlukan untuk memanggil fungsi.
Aturan serialisasi data
BOOLEANdiserialisasi sebagai tipe BOOLEAN JSON.INTEGERdanBIGINTdiserialisasi sebagai tipe NUMBER JSON.REALdanDOUBLE PRECISIONdiserialisasi sebagai tipe NUMBER JSON.TEXTdiserialisasi sebagai tipe STRING JSON.NULLdiserialisasi sebagai JSONNULL.
Contoh
Berikut adalah contoh permintaan serialisasi untuk fungsi jarak jauh dengan tanda tangan rf_demo(TEXT, INTEGER, BOOLEAN).
{
"data": [
["foo", 100, true],
[null, null, false],
["bar", 200, false]
]
} Format respons dari Function Compute ke Hologres
Saat Function Compute selesai memproses batch data, ia perlu mengembalikan data hasil ke Hologres dalam format JSON sesuai spesifikasi berikut:
Fungsi skalar
Level teratas harus berisi bidang
results, yang nilainya adalah array, dengan setiap elemen sesuai dengan satu baris hasil untuk data input.Setiap baris hasil harus berupa array, dengan ketat mengikuti urutan data input. Secara khusus, elemen ke-N harus sesuai dengan baris ke-N dari data input.
Berikut adalah contoh data pengembalian untuk batch dengan ukuran 4:
{ "results": [ ["Beijing"], ["Shanghai"], ["Shenzhen"], ["Guangzhou"] ] }UDTF: UDTF mendukung pembuatan beberapa baris keluaran dari satu baris masukan, membutuhkan nomor baris (row_num) untuk mengidentifikasi asosiasi dengan baris input asli.
Level teratas harus berisi bidang
results, yang nilainya adalah array, dengan setiap elemen sesuai dengan satu baris data keluaran.Setiap baris hasil harus berupa array yang berisi dua elemen:
row_num (elemen pertama): Nomor baris data input asli (indeks berbasis 0), digunakan untuk mengasosiasikan input dan output. row_num tidak boleh tidak berurutan dan harus dikembalikan dalam urutan menaik.
result (elemen kedua): Baris nilai pengembalian setelah pemrosesan.
Berikut adalah contoh kode sampel:
{ "results": [ [0, "Beijing"], [1, "Shanghai"], [3, "Shenzhen"], [3, "Guangzhou"], ] }
Contoh UDF
Contoh ini menggunakan fungsi unnest.
Aktifkan Function Compute.
Masuk ke Konsol Function Compute. Anda juga dapat mengklaim sejumlah rencana sumber daya gratis sesuai petunjuk UI. Untuk informasi lebih lanjut, lihat Kuota percobaan gratis.
Buat fungsi acara Function Compute.
Di panel navigasi sisi kiri, klik Functions. Di bilah navigasi atas, pilih wilayah tempat instance Hologres Anda berada.
Di halaman Functions, klik Create Function untuk pergi ke halaman Create Function.
Pilih Event Function dan konfigurasikan parameter berikut. Biarkan parameter lainnya tetap tidak berubah. Untuk informasi lebih lanjut, lihat Buat fungsi acara.
Parameter
Deskripsi
Nama Fungsi
Nama fungsi kustom. Sebagai contoh, masukkan
unnest.Lingkungan Runtime
Pilih Built-in Runtimes/Python/Python 3.10.
Metode Unggah Kode
Pilih Upload ZIP.
Paket Kode
Unggah paket kode yang telah ditulis dan dikemas.
Simpan kode berikut ke unnest.py dan kompres menjadi unnest.zip.
import json def unnest(event, context): evt = json.loads(event) data = evt.get('data', None) if data is None: raise ValueError('no "data" key in event.') if not isinstance(data, list): raise ValueError('data is not a list.') res = list() for i in range(len(data)): if len(data[i]) != 1 or not isinstance(data[i], list): raise ValueError('the item in data is not a list.') for item in data[i][0]: res.append([i, item]) return json.dumps({'results': res})Handler
Masukkan
unnest.unnest.
Buat fungsi jarak jauh Hologres.
CatatanAnda perlu menyelesaikan langkah-langkah berikut di platform HoloWeb. Untuk informasi lebih lanjut, lihat Hubungkan ke HoloWeb dan lakukan query.
CREATE EXTENSION IF NOT EXISTS function_compute; CREATE OR REPLACE FUNCTION rf_unnest(INTEGER []) RETURNS SETOF INTEGER STRICT LANGUAGE function_compute AS 'xxxxxxxxxxxxxxxxx.cn-shanghai-internal.fc.aliyuncs.com/unnest';Siapkan data uji.
CREATE TABLE test_array ( numbers INTEGER[] ); INSERT INTO test_array (numbers) VALUES (ARRAY[1, 3]), (ARRAY[2, 4]), ('{}'), (ARRAY[]::INTEGER[]), (NULL);Panggil fungsi jarak jauh.
SELECT numbers, rf_unnest(numbers) FROM test_array; numbers | rf_unnest ---------+----------- {2,4} | 2 {2,4} | 4 {1,3} | 1 {1,3} | 3 (4 rows)