Hologres V3.1 dan versi yang lebih baru mendukung pemanggilan remote ke fungsi yang ditentukan pengguna (UDF) di Function Compute (FC). Anda dapat menggunakan fungsi-fungsi ini untuk memproses logika bisnis kompleks atau melakukan operasi data lanjutan. Topik ini menjelaskan cara menggunakan UDF di Hologres.
Ikhtisar fungsi
Fungsi remote memungkinkan Anda memperluas kemampuan pemrosesan dan analisis data dengan mengintegrasikan fungsi eksternal ke dalam Hologres. Di Hologres V3.1, fungsi remote mendukung pemanggilan ke layanan Alibaba Cloud Function Compute (FC). Fitur ini memungkinkan Anda memanggil FC secara dinamis untuk memproses logika bisnis kompleks atau melakukan operasi data lanjutan saat melakukan kueri terhadap data Hologres.
Fungsi remote mendukung tiga skenario berikut:
-
Pemrosesan data real-time: Panggil fungsi eksternal secara real time selama kueri data untuk melakukan pembersihan data, konversi format, atau perhitungan kompleks.
-
Integrasi layanan pihak ketiga: Gunakan Function Compute untuk berinteraksi dengan layanan Alibaba Cloud lainnya atau API pihak ketiga menggunakan data Hologres.
-
Analitik lanjutan: Gunakan Function Compute untuk menerapkan algoritma analitik lanjutan, seperti inferensi model atau pembelajaran mesin, dan tulis hasilnya langsung ke Hologres.
Prasyarat
-
Anda memiliki instans Hologres versi V3.1 atau lebih baru. Untuk informasi selengkapnya, lihat Beli instans Hologres.
-
Anda telah mengaktifkan Function Compute, dan instans FC Anda adalah V3.0. Untuk melakukannya, login ke Function Compute console.
-
Anda telah memberikan peran terkait layanan
AliyunServiceRoleForHologresRemoteUDF.-
Masuk ke Konsol Hologres. Pada panel navigasi di sebelah kiri, klik Create a Service-linked Role.
-
Pilih
AliyunServiceRoleForHologresRemoteUDFdan klik Authorize Now. Gambar berikut menunjukkan contohnya.
-
Instance Hologres dan layanan Function Compute harus berada di wilayah yang sama.
-
Anda harus mengaktifkan layanan Alibaba Cloud Function Compute, lalu mengembangkan dan men-deploy fungsi yang dipanggil oleh Hologres. Untuk informasi selengkapnya, lihat Pengembangan kode.
Peringatan
-
Hanya fungsi yang ditentukan pengguna skalar (UDF) dan fungsi bernilai tabel yang ditentukan 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 remote tidak mendukung konstanta sebagai parameter input.
-
Fitur ini dikenai biaya di Function Compute (FC). Untuk informasi selengkapnya, lihat Penagihan.
-
Fitur ini tidak dikenai biaya tambahan di Hologres.
Kelola fungsi yang ditentukan pengguna
Buat ekstensi
Sebelum menggunakan fitur ini untuk pertama kalinya, Anda harus membuat ekstensi. Perintahnya adalah sebagai berikut:
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 |
Modenya bisa berupa IN, OUT, atau INOUT. Nilai default-nya adalah IN. Untuk menghindari ambiguitas, jangan gunakan INOUT. Sebuah fungsi hanya boleh memiliki satu parameter OUT atau INOUT. |
|
argname |
Tidak |
Nama parameter.
|
|
default_expr |
Tidak |
Nilai default. Ini hanya berlaku untuk parameter input. Jika suatu parameter memiliki nilai default, semua parameter berikutnya juga harus memiliki nilai default. |
|
|
Titik akhir FC |
LANGUAGE function_compute |
Ya |
Nilai tetap yang menyatakan penggunaan layanan Function Compute. |
fc_endpoint |
Ya |
Titik akhir jaringan internal FC. Untuk informasi selengkapnya, lihat Titik akhir layanan. |
|
func_name |
Ya |
Nama fungsi target. Anda harus membuat fungsi ini terlebih dahulu di Konsol FC. |
|
Tipe Pengembalian |
rettype |
Tidak |
Tipe nilai pengembalian. Jika fungsi memiliki parameter OUT atau INOUT, Anda dapat menghilangkan klausa RETURNS. Jika klausa tersebut ada, nilainya harus sesuai dengan tipe hasil yang tersirat dari parameter output. |
column_name |
Tidak |
Nama kolom output dalam sintaks RETURNS TABLE. Ini adalah cara lain untuk mendeklarasikan parameter OUT bernama. Perbedaannya adalah bahwa RETURNS TABLE juga menyiratkan RETURNS SETOF, yang berarti fungsi mengembalikan sebuah set. |
|
column_type |
Tidak |
Tipe data kolom output dalam sintaks RETURNS TABLE. |
|
|
Kebijakan penanganan null |
CALLED ON NULL INPUT |
Tidak |
Perilaku default. Fungsi dipanggil meskipun beberapa argumennya bernilai null. Fungsi harus menangani nilai null tersebut. |
RETURNS NULL ON NULL INPUT |
Tidak |
Fungsi secara otomatis mengembalikan null jika salah satu argumennya bernilai 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 untuk permintaan dan respons saat memanggil fungsi. Nilai yang valid:
|
Ukuran batch maksimum per permintaan |
max_batch_size |
Tidak |
Menentukan jumlah maksimum baris yang dikirim ke FC dalam setiap batch. Tujuan utamanya adalah menetapkan batas atas jumlah baris untuk pemrosesan batch bagi fungsi FC yang memiliki batasan memori atau kendala lainnya. Jika Anda tidak menentukan parameter ini, Hologres secara otomatis menghitung dan menggunakan ukuran batch optimal. Intervensi manual biasanya tidak diperlukan. |
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
Anda dapat melihat fungsi remote yang telah Anda buat.
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 |
Modenya bisa berupa IN, OUT, atau INOUT. Nilai default-nya adalah IN. Untuk menghindari ambiguitas, jangan gunakan INOUT. Sebuah fungsi hanya boleh memiliki satu parameter OUT atau INOUT. |
argname |
Tidak |
Nama parameter. Untuk parameter input, nama hanya untuk tujuan dokumentasi. Untuk parameter output, nama menentukan nama kolom dalam set hasil. Jika dihilangkan, sistem akan menghasilkan nama default. |
Contoh
DROP FUNCTION rf_add(INTEGER, INTEGER);Format interaksi data
Format permintaan dari Hologres ke FC
Hologres memanggil API InvokeFunction FC dengan permintaan POST. Badan permintaan berupa objek JSON yang berisi kunci data, yang menyimpan array dua dimensi. Setiap elemen dalam array merepresentasikan satu baris data dari batch dan berisi parameter untuk pemanggilan fungsi.
Aturan serialisasi data
-
BOOLEANdiserialisasi ke tipe boolean JSON. -
INTEGERdanBIGINTdiserialisasi ke tipe angka JSON. -
REALdanDOUBLE PRECISIONdiserialisasi ke tipe angka JSON. -
TEXTdiserialisasi ke tipe string JSON. -
NULLdiserialisasi kenullJSON.
Contoh
Kode berikut memberikan contoh permintaan serialisasi untuk fungsi remote dengan signature rf_demo(TEXT, INTEGER, BOOLEAN).
{
"data": [
["foo", 100, true],
[null, null, false],
["bar", 200, false]
]
}
Format respons dari FC ke Hologres
Setelah FC selesai memproses batch data, FC harus mengembalikan hasilnya ke Hologres dalam format JSON yang memenuhi spesifikasi berikut:
-
Scalar UDF
-
Objek tingkat atas harus berisi field
results. Nilai field ini adalah array, dan setiap elemen sesuai dengan hasil untuk satu baris data input. -
Setiap hasil harus berupa array. Hasil harus dalam urutan yang sama dengan data input. Elemen ke-N dalam array results sesuai dengan baris ke-N dari data input.
Kode berikut memberikan contoh nilai kembali untuk batch empat baris:
{ "results": [ ["Beijing"], ["Shanghai"], ["Shenzhen"], ["Guangzhou"] ] } -
-
UDTF: UDTF dapat menghasilkan beberapa baris output dari satu baris input. Nomor baris (row_num) digunakan untuk mengasosiasikan output dengan baris input asli.
-
Objek tingkat atas harus berisi field
results. Nilai field ini adalah array, dan setiap elemen sesuai dengan satu baris data output. -
Setiap elemen dalam array results harus berupa array yang berisi dua elemen:
-
row_num (elemen pertama): Indeks berbasis 0 dari baris input asli. Angka ini digunakan untuk mengasosiasikan output dengan input. Nilai row_num harus dikembalikan dalam urutan menaik.
-
result (elemen kedua): Satu baris dari nilai kembali yang telah diproses.
-
Berikut contohnya:
{ "results": [ [0, "Beijing"], [1, "Shanghai"], [3, "Shenzhen"], [3, "Guangzhou"], ] } -
Contoh fungsi yang ditentukan pengguna
Contoh ini menggunakan fungsi unnest.
-
Aktifkan Function Compute.
Login ke Function Compute console. Anda juga dapat mengklaim paket sumber daya gratis dengan kuota tertentu berdasarkan petunjuk di layar. Untuk informasi selengkapnya, lihat Kuota uji coba.
-
Buat fungsi event-triggered FC.
-
Di panel navigasi sebelah kiri, klik Functions. Alihkan ke Wilayah tempat instans Hologres Anda berada.
-
Di halaman Functions, klik Create Function. Anda kemudian akan diarahkan ke halaman Create Function.
-
Pilih Event Function dan konfigurasikan parameter berikut. Anda dapat mempertahankan nilai default untuk parameter lainnya. Untuk informasi selengkapnya, lihat Buat fungsi event-triggered.
Parameter
Deskripsi
Nama Fungsi
Masukkan nama kustom. Misalnya,
unnest.Runtime
Pilih Built-in Runtimes/Python/Python 3.10.
Metode Unggah Kode
Pilih Upload Code via ZIP Package.
Paket Kode
Unggah paket kode yang telah Anda tulis dan kemas.
Simpan kode berikut ke file bernama 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 dapat menyelesaikan langkah-langkah berikut di platform HoloWeb. Untuk informasi selengkapnya, lihat Terhubung ke HoloWeb.
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)