全部产品
Search
文档中心

MaxCompute:Parameter dinamis UDAF dan UDTF

更新时间:Jul 02, 2025

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 fungsi printf dalam bahasa pemrograman C.
    Catatan Asterisk (*) dalam nilai kembali memiliki arti yang berbeda.
  • Anda dapat menggunakan any dalam 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.
    Catatan any tidak 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,*") adalah UDTF(x, y) as (a, b, c). Dalam contoh ini, tiga alias a, b, dan c dikonfigurasikan untuk as. 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, metode forward yang dipanggil oleh UDTF harus forward array 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.