Topik ini menjelaskan parameter dinamis yang didukung oleh fungsi agregat yang didefinisikan pengguna (UDAF) MaxCompute dan fungsi bernilai tabel yang didefinisikan pengguna (UDTF) saat menggunakan anotasi Resolve.
Ekstensi sintaksis anotasi Resolve
Baik UDAF maupun UDTF MaxCompute menggunakan anotasi Resolve untuk menghasilkan tanda tangan suatu fungsi. Namun, metode ini tidak mendukung overloading karena parameter input dan output sudah tetap.
@com.aliyun.odps.udf.annotation.Resolve("BIGINT->DOUBLE")
public class UDTFClass extends UDTF {
...
}
Catatan Contoh ini mendefinisikan UDTF yang menerima parameter bertipe BIGINT dan mengembalikan nilai bertipe DOUBLE.
Sintaksis anotasi Resolve di MaxCompute telah diperluas.
- Anda dapat menggunakan asterisk (
*) dalam daftar parameter untuk menunjukkan bahwa parameter input dapat berupa panjang dan tipe apa pun. Sebagai contoh,@Resolve('double,*->String')menunjukkan daftar parameter di mana parameter pertama adalah tipe data DOUBLE, diikuti oleh parameter dengan panjang dan tipe apa pun. Dalam hal ini, Anda harus menyusun kode untuk menghitung jumlah dan tipe parameter input serta mengelolanya berdasarkan fungsiprintfdalam bahasa pemrograman C.Catatan Asterisk (*) dalam nilai kembali memiliki arti yang berbeda. - Anda dapat menggunakan
anydalam daftar parameter untuk menunjukkan bahwa parameter dari semua tipe valid. Sebagai contoh,@Resolve('double,any->string')menunjukkan daftar parameter di mana parameter pertama adalah tipe data DOUBLE dan diikuti oleh parameter dari tipe apa pun.Catatananytidak dapat digunakan dalam nilai kembali atau subtipe tipe data kompleks, seperti ARRAY. - Asterisk dapat digunakan dalam nilai kembali UDTF untuk menunjukkan bahwa sejumlah nilai bertipe STRING dapat dikembalikan. Jumlah nilai kembali didasarkan pada jumlah alias yang dikonfigurasi saat suatu fungsi dipanggil. Sebagai contoh, metode panggilan
@Resolve("ANY,ANY->DOUBLE,*")adalahUDTF(x, y) as (a, b, c). Dalam contoh ini, tiga alias a, b, dan c dikonfigurasikan untukas. Editor mengidentifikasi bahwa a adalah tipe data DOUBLE dan b dan c adalah tipe data STRING. Tipe nilai dalam kolom pertama yang dikembalikan dalam anotasi Resolve diberikan. Tiga nilai dikembalikan. Oleh karena itu, metodeforwardyang dipanggil oleh UDTF harusforwardarray dengan tiga elemen. Jika tidak, kesalahan akan dikembalikan.Catatan Namun, kesalahan tidak dikembalikan selama kompilasi. Oleh karena itu, pemanggil UDTF harus mengonfigurasi jumlah alias dalam SQL berdasarkan aturan yang didefinisikan dalam UDTF. Jumlah nilai kembali fungsi agregat tetap menjadi 1. Oleh karena itu, aturan ini tidak berpengaruh pada UDAF.
Contoh UDTF
import com.aliyun.odps.udf.UDFException;
import com.aliyun.odps.udf.UDTF;
import com.aliyun.odps.udf.annotation.Resolve;
import org.json.JSONException;
import org.json.JSONObject;
@Resolve("STRING,*->STRING,*")
public class JsonTuple extends UDTF {
private Object[] result = null;
@Override
public void process(Object[] input) throws UDFException {
if (result == null) {
result = new Object[input.length];
}
try {
JSONObject obj = new JSONObject((String)input[0]);
for (int i = 1; i < input.length; i++) {
// Bagian variabel-length dari nilai kembali harus bertipe STRING.
result[i] = String.valueOf(obj.get((String)(input[i])));
}
result[0] = null;
} catch (JSONException ex) {
for (int i = 1; i < result.length; i++) {
result[i] = null;
}
result[0] = ex.getMessage();
}
forward(result);
}
}Dalam contoh ini, jumlah nilai kembali didasarkan pada jumlah parameter input. Parameter output pertama menunjukkan file JSON, dan parameter output lainnya adalah kunci yang diuraikan dari file JSON. Nilai kembali pertama adalah pesan kesalahan selama penguraian file JSON. Jika tidak ada kesalahan, konten yang dihasilkan selama penguraian file JSON disediakan berdasarkan urutan kunci input. Contoh: -- Konfigurasikan jumlah alias output berdasarkan jumlah parameter input.
SELECT my_json_tuple(json, 'a', 'b') as exceptions, a, b FROM jsons;
-- Bagian variabel-length dapat tidak memiliki kolom.
SELECT my_json_tuple(json) as exceptions, a, b FROM jsons;
-- Kesalahan terjadi saat pernyataan SQL berikut dieksekusi karena jumlah alias tidak sesuai dengan jumlah sebenarnya.
-- Kesalahan ini tidak dikembalikan selama kompilasi.
SELECT my_json_tuple(json, 'a', 'b') as exceptions, a, b, c FROM jsons;Jika ekstensi yang dijelaskan dalam topik ini tidak memenuhi kebutuhan bisnis Anda, kami sarankan Anda menggunakan UDT untuk mengimplementasikan fitur fungsi agregat dan UDTF. Untuk informasi lebih lanjut, lihat Ikhtisar.
Catatan Untuk informasi lebih lanjut tentang Python UDTF dan Python UDAF, lihat Python 3 UDAF dan Gunakan Python 3 UDTF untuk membaca sumber daya dari MaxCompute.