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.
CatatanUntuk 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.
Sebuah klien mengirimkan pernyataan SQL ke AnalyticDB for MySQL.
Setelah fungsi REMOTE_CALL() dipanggil, AnalyticDB for MySQL mengirimkan data ke Function Compute dalam format JSON.
Function Compute memproses data menggunakan fungsi yang ditentukan pengguna.
Function Compute mengembalikan hasil ke AnalyticDB for MySQL dalam format JSON.
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.
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 |
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.
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.
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:
|
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.
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
1dan2dengan tanda ampersand (&):SELECT remote_call('varchar','ConcactNumberWithCompress','{endpoint:"1234567890000****.cn-zhangjiakou-internal.fc.aliyuncs.com"}',1,2);Hasil berikut dikembalikan:
1&2&1Jika tidak ada parameter global yang dikonfigurasi, panggil fungsi yang ditentukan pengguna ConcactNumberWithCompress untuk menggabungkan
3dan4dengan 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&1Jika parameter global telah dikonfigurasi, panggil fungsi yang ditentukan pengguna ConcactNumberWithCompress untuk menggabungkan
5dan6dengan 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.