====== HIVE UDF方式进行调用 ======
使用hive udf进行模型调用,有以下两种方案:
* 使用eppdev-mlib-sdk-hive-udf原生方案,在进行udf调用的时候需要首先输入
网关地址url、模型编码信息
* 使用自定义udf,在进行调用的时候可以配置无需输入网关地址、模型编码信
===== 使用原生方案 =====
==== 下载相应的软件包 ====
目前eppdev-mlib提供的原生udf支持hive1.2, 2.3, 3.1三个版本,需要分别下载不同
的jar包来完成模型的调用:
* hive1.2: eppdev-mlib-sdk-hive-udf12.jar
* hive2.3: eppdev-mlib-sdk-hive-udf23.jar
* hive3.1: eppdev-mlib-sdk-hive-udf31.jar
==== 上传jar到hdfs中 ====
以hive2.3为例:
hdfs dfs put eppdev-mlib-sdk-hive-udf23.jar /user/udf/hive/
==== 在hive中创建自定义函数 ====
create function eppdev_to_json as 'cn.eppdev.mlib.sdk.hive.udf.EppdevMlibToJsonUDF'
using jar 'hdfs://user/udf/hive/eppdev-mlib-sdk-hive-udf23.jar';
create function eppdev_mlib_calc as 'cn.eppdev.mlib.sdk.hive.udf.EppdevMlibCalcUDF'
using jar 'hdfs://user/udf/hive/eppdev-mlib-sdk-hive-udf23.jar';
==== 在hive中进行模型调用 ====
进行hive调用可以有两种方式:
- 输入3个参数(网关地址、模型编码、请求数据json),可以获取到全量的模型输入
- 输入4个参数(网关地址、模型编码、请求json和所需的输出项),可以获取指定的输出项
方法1: 三个参数获取结果json
select
eppdev_mlib_calc(
'http://localhost:11541/consumer',
'test-01',
eppdev_to_json(
'sepal.width', sepal_with,
'sepal.height', sepal_height,
'petal.width', petal_width,
'petal.height', petal_height
)
) as full_result
from iris_data;
输出结果为全量的json:
{
"probability(Setosa)": 1.0,
"probability(Virginica)": 0.0,
"probability(Versicolor)": 0.0,
"variety": "Setosa"
}
方法2:输入4个参数,直接获取具体结果
select
eppdev_mlib_calc(
'http://localhost:11541/consumer',
'test-01',
eppdev_to_json(
'sepal.width', sepal_with,
'sepal.height', sepal_height,
'petal.width', petal_width,
'petal.height', petal_height
),
'variety'
) as variety
from iris_data;
输出结果为veriety结果,如:Setosa
===== 使用自定义udf =====
==== 程序编码 ====
以HIVE2.3为例
=== POM依赖 ===
cn.eppdev.mlib
eppdev-mlib-sdk-hive-udf23
1.0.0
=== java ===
package cn.eppdev.mlib.sample.hive.udf;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.hive.ql.exec.UDF;
import cn.eppdev.mlib.sdk.hive.udf.EppdevMlibCalcUDF;
public class EppdevMlibTest01UDF extends EppdevMlibCalcUDF{
// 网关地址
static final CONSUMER_BASIC_URL = "http://localhost:11541/consumer";
// 模型编码
static final MODEL_CODE = "test-01";
public Text evaluate(String postJson) {
return eppdevMlibCalc(CONSUMER_BASIC_URL, MODEL_CODE, postJson);
}
public Text evaluate(String postJson, String resultField){
return eppdevMlibCalc(CONSUMER_BASIC_URL,
MODEL_CODE,
postJson,
resultField);
}
}
==== 上传jar包到hdfs中 ====
hdfs dfs put eppdev-mlib-sdk-hive-udf23.jar /user/udf/hive/
hdfs dfs put eppdev-mlib-sample-hive-udf.jar /user/udf/hive
> 上述命令中eppdev-mlib-sample-hive-udf.jar为自定义udf编译后的jar包
==== hive中创建udf ====
create function eppdev_to_json as 'cn.eppdev.mlib.sdk.hive.udf.EppdevMlibToJsonUDF'
using jar 'hdfs:///user/udf/hive/eppdev-mlib-sdk-hive-udf23.jar';
create function eppdev_mlib_calc_test01 as 'cn.eppdev.mlib.sdk.hive.udf.EppdevMlibCalcUDF'
using jar 'hdfs:///user/udf/hive/eppdev-mlib-sdk-hive-udf23.jar',
jar 'hdfs:///user/udf/hive/eppdev-mlib-sample-hive-udf.jar';
==== 在hive中进行模型调用 ====
此时进行hive调用可以有两种方式:
- 输入1个参数(请求数据json),可以获取到全量的模型输入
- 输入2个参数(请求json和所需的输出项),可以获取指定的输出
方法1:输入1个参数,获取json结果
select
eppdev_mlib_calc_test01(
eppdev_to_json(
'sepal.width', sepal_with,
'sepal.height', sepal_height,
'petal.width', petal_width,
'petal.height', petal_height
)
) as full_result
from iris_data;
输出结果为全量json
{
"probability(Setosa)": 1.0,
"probability(Virginica)": 0.0,
"probability(Versicolor)": 0.0,
"variety": "Setosa"
}
方法2:输入2个参数,获取具体结果
select
eppdev_mlib_calc(
eppdev_to_json(
'sepal.width', sepal_with,
'sepal.height', sepal_height,
'petal.width', petal_width,
'petal.height', petal_height
),
'variety'
) as variety
from iris_data;
输出结果为veriety结果,如:Setosa