全部产品
Search
文档中心

AnalyticDB:UDF

更新时间:Dec 16, 2025

AnalyticDB for MySQL memungkinkan Anda menggunakan fungsi REMOTE_CALL() untuk memanggil fungsi kustom yang dibuat di Function Compute, sehingga Anda dapat menggunakan user-defined functions (UDFs) di AnalyticDB for MySQL.

Prasyarat

  • Versi kernel kluster Anda adalah 3.2.1.0 atau yang lebih baru.

  • Kluster dan layanan Function Compute berada di wilayah yang sama. Untuk informasi selengkapnya, lihat Activate Function Compute.

  • Fungsi yang ditentukan pengguna telah dibuat.

    Catatan

    Untuk waktu startup Function Compute yang lebih cepat saat fungsi dipanggil, pilih Python, Go, atau Node.js sebagai Runtime Environment saat membuat fungsi yang ditentukan pengguna.

Cara kerja

Fitur remote UDF dari AnalyticDB for MySQL menggunakan Function Compute sebagai server fungsi remote. Anda dapat menggunakan fungsi REMOTE_CALL() di AnalyticDB for MySQL untuk memanggil UDF yang telah didefinisikan sebelumnya di Function Compute. Bagan alir berikut menggambarkan proses tersebut.

image
  1. Sebuah klien mengirimkan pernyataan SQL ke AnalyticDB for MySQL.

  2. Setelah fungsi REMOTE_CALL() dipanggil, AnalyticDB for MySQL mengirimkan data ke Function Compute dalam format JSON.

  3. Function Compute memproses data menggunakan fungsi yang ditentukan pengguna.

  4. Function Compute mengembalikan hasil ke AnalyticDB for MySQL dalam format JSON.

  5. AnalyticDB for MySQL kemudian mengembalikan hasil akhir ke klien.

Catatan penggunaan

Fitur remote UDF hanya mendukung scalar UDF.

Sintaks

remote_call('returnType', 'func_name', ['{external_config}'|NULL], X1, X2, ..., Xn)

Parameter

Parameter

Deskripsi

returnType

Tipe data dari nilai kembali. Hanya tipe data BOOLEAN, DOUBLE, VARCHAR, INTEGER, TINYINT, BIGINT, TIME, DATE, TIMESTAMP, dan DATETIME yang didukung.

func_name

Nama fungsi yang ditentukan pengguna yang Anda buat di Function Compute.

  • Jika versi Function Compute adalah 3.0, cukup tentukan nama fungsi yang ditentukan pengguna.

  • Jika versi Function Compute adalah 2.0, tentukan nama layanan dan nama fungsi, yang dihubungkan dengan tanda dolar ($). Format: serviceName$functionName.

Catatan

Login ke Function Compute console untuk melihat versi Function Compute.

external_config|null

Parameter tambahan untuk pemanggilan fungsi. Jika tidak ada parameter tambahan yang digunakan, tentukan null. Parameter tambahan harus dalam format JSON. Pisahkan beberapa parameter dengan koma (,).

Anda dapat menetapkan parameter tambahan dalam kueri, atau mengonfigurasi parameter global menggunakan perintah SET ADB_CONFIG. Jika parameter dikonfigurasi baik di tingkat kueri maupun tingkat global, parameter tingkat kueri akan diutamakan. Untuk informasi selengkapnya tentang parameter tambahan, lihat Supported extended parameters for external_config.

X1.......Xn

Parameter input. Hanya tipe data BOOLEAN, DOUBLE, VARCHAR, INTEGER, TINYINT, BIGINT, TIME, DATE, TIMESTAMP, dan DATETIME yang didukung.

Tabel berikut menjelaskan parameter tambahan yang didukung oleh external_config.

Parameter global

Parameter tingkat kueri

Wajib

Deskripsi

XIHE_REMOTE_CALL_SERVER_ENDPOINT

endpoint

Ya

Titik akhir layanan internal Function Compute. Untuk informasi selengkapnya, lihat Service endpoints.

XIHE_REMOTE_CALL_SERVER_AK

-

Wajib dalam kondisi tertentu

ID AccessKey dari Akun Alibaba Cloud atau Pengguna Resource Access Management (RAM) yang memiliki izin yang dikelola layanan pada Function Compute.

  • Jika kluster AnalyticDB for MySQL Anda adalah kluster Data Warehouse Edition, Anda harus mengonfigurasi ID AccessKey.

  • Jika kluster AnalyticDB for MySQL Anda adalah kluster Enterprise Edition, Basic Edition, dan Data Lakehouse Edition:

    • Saat Anda mengakses layanan Function Compute dalam akun yang sama, Security Token Service (STS) secara otomatis digunakan untuk autentikasi. Anda tidak perlu mengonfigurasi ID AccessKey.

    • Saat Anda melakukan akses lintas akun ke layanan Function Compute, Anda harus mengonfigurasi ID AccessKey.

Untuk informasi selengkapnya tentang cara mendapatkan ID AccessKey, lihat Accounts and permissions.

Penting

Parameter XIHE_REMOTE_CALL_SERVER_AK hanya dapat dikonfigurasi sebagai parameter global.

XIHE_REMOTE_CALL_SERVER_SK

-

Wajib dalam kondisi tertentu

Rahasia AccessKey dari Akun Alibaba Cloud atau Pengguna RAM yang memiliki izin yang dikelola layanan pada Function Compute.

  • Jika kluster AnalyticDB for MySQL Anda adalah kluster Data Warehouse Edition, Anda harus mengonfigurasi Rahasia AccessKey.

  • Jika kluster AnalyticDB for MySQL Anda adalah kluster Enterprise Edition, Basic Edition, dan Data Lakehouse Edition:

    • Saat Anda mengakses layanan Function Compute dalam akun yang sama, STS secara otomatis digunakan untuk autentikasi. Anda tidak perlu mengonfigurasi Rahasia AccessKey.

    • Saat Anda melakukan akses lintas akun ke layanan Function Compute, Anda harus mengonfigurasi Rahasia AccessKey.

Untuk informasi selengkapnya tentang cara mendapatkan Rahasia AccessKey, lihat Accounts and permissions.

Penting

Parameter XIHE_REMOTE_CALL_SERVER_SK hanya dapat dikonfigurasi sebagai parameter global.

XIHE_REMOTE_CALL_COMPRESS_ENABLED

compressed

Tidak

Menentukan apakah data dikompresi ke format GZIP sebelum AnalyticDB for MySQL mengirimkan data ke Function Compute. Nilai yang valid:

  • true (default): Mengompresi data.

  • false: Tidak.

XIHE_REMOTE_CALL_MAX_BATCH_SIZE

max_batch_size

Tidak

Jumlah maksimum baris data yang dapat dikirim ke Function Compute dalam setiap batch setelah fungsi REMOTE_CALL() dipanggil. Secara default, tidak ada batasan. Jumlah baris data yang lebih kecil mengurangi tekanan CPU dan memori pada Function Compute, tetapi meningkatkan waktu eksekusi kueri.

Contoh

Contoh fungsi yang ditentukan pengguna di Function Compute

Saat fungsi REMOTE_CALL() dipanggil, AnalyticDB for MySQL mengirimkan data ke Function Compute dalam format JSON. Setelah data diproses, Function Compute mengembalikan hasil dalam format JSON. Anda harus menulis fungsi yang ditentukan pengguna di Function Compute sesuai dengan format pengiriman dan pengembalian data yang ditentukan.

Format pengiriman dan pengembalian data

Format pengiriman data

{
  "rowCount": 3, 
  "compressed":true, 
  "data": 
  [
      [1, "a", "2023-08-22 11:30:00"],
      [2, "b", "2023-08-22 12:30:00"],
      [3, "c", null]
  ]
}

Struktur data JSON:

  • rowCount: Jumlah baris data.

  • compressed: Menentukan apakah data yang dikirim dikompresi. Nilai yang valid: true dan false.

  • data: Data yang dikirim. Parameter ini terdiri dari beberapa array JSON. Setiap array JSON merepresentasikan satu baris data.

Format pengembalian data

{
  "success": true,   
  "message": "",  
  "result" : [  ] 
}

Struktur data JSON:

  • success: Menunjukkan apakah permintaan berhasil. Nilai yang valid: true dan false.

  • message: Informasi detail. Jika permintaan berhasil, parameter ini kosong. Jika permintaan gagal, parameter ini berisi pesan error.

  • result: Hasil yang dihitung di Function Compute.

Pada contoh ini, fungsi yang ditentukan pengguna yang dibuat di Function Compute bernama ConcactNumberWithCompress. Berikut adalah kode contohnya:

public class App
        implements StreamRequestHandler, FunctionInitializer
{
    public static final Logger log = Logger.getLogger(App.class.getName());

    public void initialize(Context context)
            throws IOException
    {
        // TODO
    }

    @Override
    public void handleRequest(
            InputStream inputStream, OutputStream outputStream, Context context)
            throws IOException
    {
        InputStream notCompressedInputStream1;
        notCompressedInputStream1 = tryUnCompress(inputStream);

        JSONObject response = new JSONObject();
        try {
            JSONObject requestJson = JSONObject.parseObject(IOUtils.toString(notCompressedInputStream1));
            if (requestJson.containsKey("data")) {
                JSONArray result = new JSONArray();
                JSONArray data = requestJson.getJSONArray("data");
                for (int i = 0; i < data.size(); i++) {
                    JSONArray row = data.getJSONArray(i);
                    // Implementasikan logika bisnis Function Compute di sini.
                    // Anggaplah fungsi memiliki dua parameter input, a dan b. Setiap baris data yang dikirim dari AnalyticDB for MySQL berisi dua angka. Angka pertama adalah a, dan angka kedua adalah b.
                    if (row.size() == 2) {
                        result.add(testFunc(row.getInteger(0), row.getInteger(1)));
                    }
                    else {
                        throw new RuntimeException("row size is not 2");
                    }
                    // Logika bisnis Function Compute berakhir di sini.
                }

                response.put("result", result);
                response.put("success", true);
                response.put("message", "");
            }
            else {
                response.put("success", false);
                response.put("message", "no data inside");
            }
        }
        catch (Exception e) {
            log.info("error happened" + e.getMessage());
            response.put("success", false);
            response.put("message", e.getMessage());
        }

        outputStream.write(tryCompress(response.toJSONString().getBytes()));
    }

    private String testFunc(int a, int b)
    {
        // Fungsi uji menggabungkan parameter input a dan b serta angka 1 menggunakan tanda ampersand (&).
        return String.valueOf(a) + '&' + b + '&' + 1;
    }

    public static byte[] tryCompress(byte[] bytes)
    {
        ByteArrayOutputStream byteOutputStream = new ByteArrayOutputStream();
        try {
            GZIPOutputStream gzipOutputStream = new GZIPOutputStream(byteOutputStream);
            gzipOutputStream.write(bytes);
            gzipOutputStream.close();
        }
        catch (IOException e) {
            throw new RuntimeException(e);
        }

        return byteOutputStream.toByteArray();
    }

    public static InputStream tryUnCompress(InputStream inputStream)
            throws IOException
    {
        GZIPInputStream gzipInputStream;
        gzipInputStream = new GZIPInputStream(inputStream);
        return gzipInputStream;
    }
}

Contoh pemanggilan fungsi REMOTE_CALL di AnalyticDB for MySQL

  • Jika tidak ada parameter global yang dikonfigurasi, panggil fungsi yang ditentukan pengguna ConcactNumberWithCompress untuk menggabungkan 1 dan 2 dengan tanda ampersand (&):

    SELECT remote_call('varchar','ConcactNumberWithCompress','{endpoint:"1234567890000****.cn-zhangjiakou-internal.fc.aliyuncs.com"}',1,2);

    Hasil berikut dikembalikan:

    1&2&1
  • Jika tidak ada parameter global yang dikonfigurasi, panggil fungsi yang ditentukan pengguna ConcactNumberWithCompress untuk menggabungkan 3 dan 4 dengan tanda ampersand (&):

    SELECT remote_call('varchar','ConcactNumberWithCompress','{endpoint:"1234567890000****.cn-zhangjiakou-internal.fc.aliyuncs.com",compressed:false,max_batch_size:5000000}',3,4);

    Hasil berikut dikembalikan:

    3&4&1
  • Jika parameter global telah dikonfigurasi, panggil fungsi yang ditentukan pengguna ConcactNumberWithCompress untuk menggabungkan 5 dan 6 dengan tanda ampersand (&):

    SELECT remote_call('varchar','ConcactNumberWithCompress',null,5,6);

    Hasil berikut dikembalikan:

    5&6&1

FAQ

Mengapa terjadi error java.util.zip.ZipException: Not in GZIP format saat saya memanggil fungsi REMOTE_CALL?

  • AnalyticDB for MySQL mengompresi data ke format GZIP dan mengirimkannya ke Function Compute. Namun, fungsi yang ditentukan pengguna yang dibuat di Function Compute tidak berisi kode dekompresi. Akibatnya, Function Compute tidak dapat mengurai data tersebut.

  • AnalyticDB for MySQL mengirimkan data yang tidak terkompresi ke Function Compute. Setelah diproses, Function Compute mengompresi hasilnya menggunakan format GZIP dan mengembalikannya ke AnalyticDB for MySQL. Akibatnya, AnalyticDB for MySQL tidak dapat mengurai data tersebut.

Mengapa terjadi error parse remote_call config error saat saya memanggil fungsi REMOTE_CALL?

Sintaks parameter external_config dalam fungsi REMOTE_CALL salah. Periksa dan perbaiki pernyataan SQL, lalu jalankan kembali.