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:
MaxCompute istemcisi yüklü ve yapılandırılmış olmalıdır. Bkz. MaxCompute istemcisini yükleme ve yapılandırma
Ö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
-
Ö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;ÖnemliTüm JAR dosyalarını
ADD JARkomutunda 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.
-
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.
-
Hive uyumluluk modunu etkinleştirin ve UDF'yi çağırın. Her iki komutu tek bir çalıştırmada birlikte gönderin:
NotBir 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.