全部产品
Search
文档中心

MaxCompute:Contoh: Gunakan Hive UDF yang versi Hivenya kompatibel dengan MaxCompute

更新时间:Jul 02, 2025

Topik ini menjelaskan cara menggunakan fungsi yang ditentukan pengguna (UDF) Hive yang kompatibel dengan MaxCompute pada klien MaxCompute.

Prasyarat

Klien MaxCompute harus sudah diinstal. Untuk informasi lebih lanjut, lihat Instal dan Konfigurasikan Klien MaxCompute.

Peringatan

Sebelum menggunakan Hive UDF, perhatikan hal-hal berikut:

  • Saat menjalankan perintah ADD JAR untuk menambahkan paket sumber daya Hive UDF pada klien MaxCompute, Anda harus menentukan semua file JAR yang ingin ditambahkan karena MaxCompute tidak dapat secara otomatis menambahkan semua file JAR ke classpath.

  • Untuk memanggil Hive UDF, tambahkan perintah set odps.sql.hive.compatible=true; sebelum pernyataan SQL yang akan dijalankan. Kemudian, kirim dan jalankan perintah serta pernyataan SQL tersebut bersama-sama.

  • Jika Java UDF dijalankan dalam lingkungan terdistribusi, UDF dibatasi oleh sandbox Java untuk MaxCompute. Untuk informasi lebih lanjut, lihat Java Sandbox.

  • UDF memulai proses baru untuk perhitungan. Jika sumber daya kluster tidak mencukupi, ada kemungkinan kecil bahwa UDF gagal berjalan karena waktu habis saat memulai proses baru.

Contoh kode

Contoh kode:

package com.aliyun.odps.compiler.hive;
import org.apache.hadoop.hive.ql.exec.UDFArgumentException;
import org.apache.hadoop.hive.ql.metadata.HiveException;
import org.apache.hadoop.hive.ql.udf.generic.GenericUDF;
import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector;
import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspectorFactory;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
public class Collect extends GenericUDF {
  @Override
  public ObjectInspector initialize(ObjectInspector[] objectInspectors) throws UDFArgumentException {
    if (objectInspectors.length == 0) {
      throw new UDFArgumentException("Collect: input args should >= 1");
    }
    for (int i = 1; i < objectInspectors.length; i++) {
      if (objectInspectors[i] != objectInspectors[0]) {
        throw new UDFArgumentException("Collect: input oi should be the same for all args");
      }
    }
    return ObjectInspectorFactory.getStandardListObjectInspector(objectInspectors[0]);
  }
  @Override
  public Object evaluate(DeferredObject[] deferredObjects) throws HiveException {
    List<Object> objectList = new ArrayList<>(deferredObjects.length);
    for (DeferredObject deferredObject : deferredObjects) {
      objectList.add(deferredObject.get());
    }
    return objectList;
  }
  @Override
  public String getDisplayString(String[] strings) {
    return "Collect";
  }
}

Kode di atas mengemas sejumlah parameter acak dari tipe data apa pun ke dalam array. Dalam contoh ini, file JAR dari Hive UDF diberi nama test.jar.

Prosedur

  1. Instal dan mulai klien MaxCompute.

  2. Kemas contoh kode menjadi file JAR menggunakan Hive. Kemudian, jalankan perintah berikut untuk menambahkan file JAR sebagai sumber daya MaxCompute.

    -- Tambahkan file JAR sebagai sumber daya MaxCompute. 
    add jar test.jar;

    Untuk informasi lebih lanjut tentang cara menambahkan sumber daya, lihat Tambahkan Sumber Daya.

  3. Jalankan perintah berikut untuk membuat UDF:

    -- Buat UDF. 
    create function hive_collect as 'com.aliyun.odps.compiler.hive.Collect' using 'test.jar';

    Untuk informasi lebih lanjut tentang cara membuat UDF, lihat Buat UDF.

  4. Jalankan perintah berikut untuk memanggil UDF:

    -- Aktifkan edisi tipe data yang kompatibel dengan Hive untuk proyek MaxCompute. 
    set odps.sql.hive.compatible=true;
    -- Panggil UDF. 
    select hive_collect(4y, 5y, 6y);

    Hasil berikut dikembalikan:

    +------+
    | _c0  |
    +------+
    | [4, 5, 6] |
    +------+