====== 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