全部产品
Search
文档中心

Hologres:Remote UDFs

更新时间:Jul 29, 2025

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 AliyunServiceRoleForHologresRemoteUDF telah dibuat.

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

    2. Pilih AliyunServiceRoleForHologresRemoteUDF, dan klik Authorize Now untuk menyelesaikan otorisasi.

      yuyuyuuyueeeee

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

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

  • Nama fungsi harus unik dalam skema yang sama dan tidak boleh bertentangan dengan fungsi yang ada dengan tipe parameter yang sama. Namun, overloading fungsi melalui tipe parameter yang berbeda didukung, seperti rf_sum(int) dan rf_sum(float).

  • Untuk menghindari konflik, disarankan untuk menambahkan awalan seragam rf_ ke fungsi jarak jauh.

  • Jika skema ditentukan, seperti schema1.func, fungsi akan dibuat di skema tersebut.

  • Saat mengganti fungsi menggunakan CREATE OR REPLACE FUNCTION, Anda tidak dapat mengubah nama fungsi, tipe parameter, atau tipe nilai balik. Untuk melakukan operasi ini, Anda perlu menghapus dan membuat ulang 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.

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

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

Algoritma kompresi permintaan

compression

Tidak

Menentukan algoritma kompresi yang digunakan dalam permintaan dan respons saat fungsi dipanggil. Nilai valid:

  • None: Menonaktifkan kompresi (default).

  • GZIP: Mengaktifkan kompresi GZIP.

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

  • BOOLEAN diserialisasi sebagai tipe BOOLEAN JSON.

  • INTEGER dan BIGINT diserialisasi sebagai tipe NUMBER JSON.

  • REAL dan DOUBLE PRECISION diserialisasi sebagai tipe NUMBER JSON.

  • TEXT diserialisasi sebagai tipe STRING JSON.

  • NULL diserialisasi sebagai JSON NULL.

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.

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

  2. Buat fungsi acara Function Compute.

    1. Di panel navigasi sisi kiri, klik Functions. Di bilah navigasi atas, pilih wilayah tempat instance Hologres Anda berada.

    2. Di halaman Functions, klik Create Function untuk pergi ke halaman Create Function.

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

  3. Buat fungsi jarak jauh Hologres.

    Catatan

    Anda 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';
  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)