Tüm Ürünler
Search
Belge Merkezi

MaxCompute:Örnek: MaxCompute ile uyumlu Hive sürümüne sahip bir Hive UDF kullanma

Son Güncelleme:Oct 04, 2026

MaxCompute'in Hive sürümüyle uyumlu bir Hive kullanıcı tanımlı işlevini (UDF), yeniden yazmaya gerek kalmadan doğrudan MaxCompute istemcisinde kullanın.

Önkoşullar

Başlamadan önce aşağıdaki gereksinimleri karşıladığınızdan emin olun:

Örnek kod

Aşağıdaki Java sınıfı Collect, aynı veri türündeki birden çok bağımsız değişkeni bir dizi halinde toplamak için GenericUDF sınıfından türetilmiştir. Bu sınıfı kendi Hive UDF'nizin temeli olarak kullanabilirsiniz.

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";
  }
}

Bu örnekte, bu sınıftan derlenen JAR dosyasının adı test.jar olarak belirlenmiştir.

UDF'yi kaydetme ve çağırma

  1. MaxCompute istemcisini yükleyin ve başlatın.

  2. Örnek kodu Hive kullanarak bir JAR dosyasında paketleyin ve ardından bunu MaxCompute kaynağı olarak ekleyin:

    -- Add the JAR file as a MaxCompute resource.
    add jar test.jar;
    Önemli

    Tüm JAR dosyalarını ADD JAR komutunda açıkça belirtin. MaxCompute, JAR dosyalarını sınıf yoluna otomatik olarak eklemez.

    Kaynak ekleme hakkında ayrıntılı bilgi için bkz. Kaynak ekleme.

  3. UDF sınıfınızla eşleşen bir işlev oluşturun:

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

    Ayrıntılar için bkz. UDF oluşturma.

  4. Hive uyumluluk modunu etkinleştirin ve UDF'yi çağırın. Her iki komutu tek bir çalıştırmada birlikte gönderin:

    Not

    Bir Hive UDF'sini çağıran herhangi bir SQL ifadesinden önce set odps.sql.hive.compatible=true; satırını ekleyin ve her iki satırı birlikte gönderin.

    -- Enable the Hive-compatible data type edition for the MaxCompute project.
    set odps.sql.hive.compatible=true;
    -- Call the UDF.
    select hive_collect(4y, 5y, 6y);

    Beklenen çıktı:

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

Kullanım notları

  • Java sandbox: Dağıtılmış bir ortamda çalışan Hive UDF'leri, MaxCompute Java sandbox kurallarına tabidir. Bkz. Java sandbox.

  • İşlem başlatma zaman aşımı: Her UDF çağrısı yeni bir işlem başlatır. Küme kaynakları yetersizse, UDF işlem başlatma zaman aşımı nedeniyle çalıştırılamayabilir.