本文以在MaxCompute用戶端操作為例,為您介紹如何使用在MaxCompute相容的Hive版本上開發的Hive UDF。
前提條件
已安裝MaxCompute用戶端。更多安裝操作,請參見安裝並配置MaxCompute用戶端。
注意事項
使用相容的Hive UDF時,您需要注意:
在MaxCompute上使用
add jar
命令添加Hive UDF的資源時,您需要指定所有JAR包,MaxCompute無法自動將所有JAR包加入Classpath。調用Hive UDF時,需要在SQL語句前添加
set odps.sql.hive.compatible=true;
語句,與SQL語句一起提交執行。Java UDF在分布式環境中運行時,請注意MaxCompute的Java沙箱限制。
UDF會起新進程計算,當叢集資源緊張時,會有小機率因新進程啟動排隊逾時而失敗。
Hive UDF程式碼範例
Hive UDF代碼如下。
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";
}
}
該UDF程式碼範例可以將任意類型、數量的參數打包成ARRAY輸出。假設Hive UDF對應的JAR包名稱為test.jar。
操作步驟
將Hive UDF程式碼範例通過Hive平台編譯為JAR包,執行如下命令將Hive UDF JAR包添加為MaxCompute資源。
--添加資源。 add jar test.jar;
更多添加資源資訊,請參見添加資源。
執行如下命令註冊UDF函數。
--註冊函數。 create function hive_collect as 'com.aliyun.odps.compiler.hive.Collect' using 'test.jar';
更多註冊函數資訊,請參見註冊函數。
執行如下SQL語句調用建立的UDF函數。
--設定MaxCompute專案的模式為Hive相容模式。 set odps.sql.hive.compatible=true; --調用UDF函數。 select hive_collect(4y, 5y, 6y);
返回結果如下。
+------+ | _c0 | +------+ | [4, 5, 6] | +------+