All Products
Search
Document Center

Hologres:Fungsi yang Ditentukan Pengguna (Remote UDFs)

Last Updated:Feb 05, 2026

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.

    1. Masuk ke Konsol Hologres. Pada panel navigasi di sebelah kiri, klik Create a Service-linked Role.

    2. Pilih AliyunServiceRoleForHologresRemoteUDF dan klik Authorize Now. Gambar berikut menunjukkan contohnya.

      yuyuyuuyueeeee

Catatan
  • 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, dan TEXT.

  • 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.

  • Nama fungsi harus unik dalam schema yang sama dan tidak boleh bertentangan dengan fungsi yang sudah ada yang memiliki tipe parameter yang sama. Namun, Anda dapat melakukan overload fungsi dengan nama yang sama jika memiliki tipe parameter berbeda, seperti rf_sum(int) dan rf_sum(float).

  • Untuk menghindari konflik, tambahkan awalan rf_ pada semua fungsi remote.

  • Jika Anda menentukan schema, seperti schema1.func, fungsi akan dibuat di schema tersebut.

  • Saat menggunakan CREATE OR REPLACE FUNCTION untuk mengganti fungsi, Anda tidak dapat mengubah nama fungsi, tipe parameter, atau tipe nilai kembali. Untuk melakukan perubahan tersebut, Anda harus menghapus dan membuat ulang 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.

  • 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.

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 LATEST.

Algoritma kompresi permintaan

compression

Tidak

Menentukan algoritma kompresi untuk permintaan dan respons saat memanggil fungsi. Nilai yang valid:

  • None: Menonaktifkan kompresi. Ini adalah nilai default.

  • GZIP: Mengaktifkan kompresi GZIP.

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

  • BOOLEAN diserialisasi ke tipe boolean JSON.

  • INTEGER dan BIGINT diserialisasi ke tipe angka JSON.

  • REAL dan DOUBLE PRECISION diserialisasi ke tipe angka JSON.

  • TEXT diserialisasi ke tipe string JSON.

  • NULL diserialisasi ke null JSON.

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.

  1. 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.

  2. Buat fungsi event-triggered FC.

    1. Di panel navigasi sebelah kiri, klik Functions. Alihkan ke Wilayah tempat instans Hologres Anda berada.

    2. Di halaman Functions, klik Create Function. Anda kemudian akan diarahkan ke halaman Create Function.

    3. 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.

  3. Buat fungsi jarak jauh Hologres.

    Catatan

    Anda 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';
  4. Siapkan data uji.

    CREATE TABLE test_array (
        numbers INTEGER[]
    );
    
    INSERT INTO test_array (numbers) VALUES
      (ARRAY[1, 3]),
      (ARRAY[2, 4]),
      ('{}'),  
      (ARRAY[]::INTEGER[]),  
      (NULL);
  5. 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)