当前位置: 首页 > news >正文

网站开发标准合同百度一下首页百度一下

网站开发标准合同,百度一下首页百度一下,asp静态网站源码,360安全浏览器官网入口文章目录 UDF 是什么#xff1f;reflect静态方法调用实例方法调用 自定义 UDF#xff08;GenericUDF#xff09;1.创建项目2.创建类继承 UDF3.数据类型判断4.编写业务逻辑5.定义函数描述信息6.打包与上传7.注册 UDF 函数并测试返回复杂的数据类型 UDF 是什么#xff1f; H… 文章目录 UDF 是什么reflect静态方法调用实例方法调用 自定义 UDFGenericUDF1.创建项目2.创建类继承 UDF3.数据类型判断4.编写业务逻辑5.定义函数描述信息6.打包与上传7.注册 UDF 函数并测试返回复杂的数据类型 UDF 是什么 Hive 中的 UDF 其实就是用户自定义函数允许用户注册使用自定义的逻辑对数据进行处理丰富了Hive 对数据处理的能力。 UDF 负责完成对数据一进一出处理的操作和 Hive 中存在的函数 year、month、day 等相同。 reflect 在 Hive 中可以使用 reflect() 方法通过 Java 反射机制调用 Java 类的方法。 通俗来说它可以调用 Hive 中不存在但是 JDK 中拥有的方法。 语法 reflect() 函数的语法为reflect(class,method[,arg1[,arg2..]])。 静态方法调用 假设当前在 Java 中存在类如下 package com.example;public class MathUtils {public static int addNumbers(int a, int b) {return a b;} }那么使用 reflect() 方法调用时如下所示 SELECT reflect(com.example.MathUtils, addNumbers, 3, 5) AS result;注意 这里的类 com.example.MathUtils 并不是在 JDK 中真实存在的只是我作为说明的一个案例 reflect() 方法只能调用 JDK 中原生内置存在的方法。 所以当你需要使用 reflect() 方法时需要先去查找调用的目标方法全类名、方法名以及是否需要传递参数。 实例方法调用 当我们需要调用 Java 中的实例方法时先创建 Java 对象然后再调用其方法。 例如将乱码的字符串进行解析。 SELECT reflect(java.net.URLDecoder, decode, Mozilla/5.0%20(compatible;%20MJ12bot/v1.4.7;%20http://www.majestic12.co.uk/bot.php?),utf-8) as result;结果输出如下 自定义 UDFGenericUDF Hive 支持两种 UDF 函数自定义操作分别是 GenericUDF通用UDF用于实现那些可以处理任意数据类型的函数。它们的输入和输出类型可以是任意的但需要在函数内部处理类型转换和逻辑可以实现更复杂的逻辑处理。 UDF用于实现那些只能处理特定数据类型的函数。每个 UDF 都明确指定了输入参数的类型和返回值类型使用更为简单。 本文采用的是通用 UDF —— GenericUDF 实现方法 这里通过一个在 Hive 中实现两数相加的自定义 UDF 案例来进行说明看完你就会啦轻松拿捏。 1.创建项目 在 IDEA 中创建一个 Maven 项目引入 Hive 依赖如下所示 ?xml version1.0 encodingUTF-8? project xmlnshttp://maven.apache.org/POM/4.0.0xmlns:xsihttp://www.w3.org/2001/XMLSchema-instancexsi:schemaLocationhttp://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsdmodelVersion4.0.0/modelVersiongroupIdorg.jsu/groupIdartifactIdMyUDF/artifactIdversion1.0-SNAPSHOT/versionpropertiesmaven.compiler.source8/maven.compiler.sourcemaven.compiler.target8/maven.compiler.target/propertiesdependencies!-- hive-exec依赖无需打到jar包故scope使用provided--dependencygroupIdorg.apache.hive/groupIdartifactIdhive-exec/artifactIdversion3.1.3/versionscopeprovided/scope/dependency/dependenciesbuildpluginsplugingroupIdorg.apache.maven.plugins/groupIdartifactIdmaven-assembly-plugin/artifactIdversion3.0.0/versionconfiguration!--将依赖编译到jar包中--descriptorRefsdescriptorRefjar-with-dependencies/descriptorRef/descriptorRefs/configurationexecutions!--配置执行器--executionidmake-assembly/id!--绑定到package执行周期上--phasepackage/phasegoals!--只运行一次--goalsingle/goal/goals/execution/executions/plugin/plugins/build/project注意引入的 Hive 依赖版本请保持和你集群中使用的版本一致。 2.创建类继承 UDF 创建一个类我这里取名为 AddTest继承 Hive UDF 父类 GenericUDF需要重写三个方法如下所示 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;public class AddTest extends GenericUDF {Overridepublic ObjectInspector initialize(ObjectInspector[] objectInspectors) throws UDFArgumentException {return null;}Overridepublic Object evaluate(DeferredObject[] deferredObjects) throws HiveException {return null;}Overridepublic String getDisplayString(String[] strings) {return null;} }initialize(ObjectInspector[] objectInspectors) 方法 这个方法是在 UDF 初始化时调用的。它用于执行一些初始化操作并且可以用来验证 UDF 的输入参数类型是否正确。参数 objectInspectors 是一个包含输入参数的 ObjectInspector 数组它描述了每个输入参数的类型和结构。 一般在这个方法中检查输入参数的数量和类型是否满足你的函数的要求。如果输入参数不符合预期你可以抛出 UDFArgumentException 异常。如果一切正常你需要返回一个合适的 ObjectInspector 对象它描述了你的函数返回值的类型。 evaluate(DeferredObject[] deferredObjects) 方法 在这个方法中定义真正执行 UDF 逻辑的地方获取输入的参数并且根据输入参数执行相应的计算或操作。参数 deferredObjects 是一个包含输入参数的 DeferredObject 数组你可以通过它来获取实际的输入值。 getDisplayString(String[] strings) 方法 这个方法用于描述 UDF 的信息用于生成可读的查询执行计划Explain以便用户了解查询的结构和执行过程。 3.数据类型判断 实现 UDF 的第一步操作就是在 initialize 方法中判断用户输入的参数是否合法出现错误时进行反馈。 在这里主要分为三个步骤 检验参数个数 检查参数类型 定义函数返回值类型 一般情况下可以使用下面的模板 Overridepublic ObjectInspector initialize(ObjectInspector[] objectInspectors) throws UDFArgumentException {// 1.校验参数个数if (objectInspectors.length ! 2) {throw new UDFArgumentException(参数个数有误);}// 2.检查第1个参数是否是int类型// 判断第1个参数的基本类型ObjectInspector num1 objectInspectors[0];if (num1.getCategory() ! ObjectInspector.Category.PRIMITIVE) {throw new UDFArgumentException(第1个参数不是基本数据类型);}// 第1个参数类型判断PrimitiveObjectInspector temp (PrimitiveObjectInspector) num1;if (PrimitiveObjectInspector.PrimitiveCategory.INT ! temp.getPrimitiveCategory()) {throw new UDFArgumentException(第1个参数应为INT类型);}// 2.检查第2个参数是否是int类型// 判断第2个参数的基本类型ObjectInspector num2 objectInspectors[1];if (num2.getCategory() ! ObjectInspector.Category.PRIMITIVE) {throw new UDFArgumentException(第2个参数不是基本数据类型);}// 第2个参数类型判断PrimitiveObjectInspector temp2 (PrimitiveObjectInspector) num2;if (PrimitiveObjectInspector.PrimitiveCategory.INT ! temp2.getPrimitiveCategory()) {throw new UDFArgumentException(第2个参数应为INT类型);}// 3.设置函数返回值类型返回一个整型数据return PrimitiveObjectInspectorFactory.javaIntObjectInspector;}4.编写业务逻辑 在 evaluate 方法中定义业务逻辑这里比较简单就是实现两数相加。 Overridepublic Object evaluate(DeferredObject[] deferredObjects) throws HiveException {// 完成两数相加的逻辑计算int num1 Integer.parseInt(deferredObjects[0].get().toString());int num2 Integer.parseInt(deferredObjects[1].get().toString());return num1 num2;}5.定义函数描述信息 在 getDisplayString 方法中定义函数在 Explain 中的描述信息一般都是固定写法如下所示 Overridepublic String getDisplayString(String[] strings) {return getStandardDisplayString(AddTest, strings);}把对应的函数名称进行替换即可。 6.打包与上传 对编写的项目进行打包并上传到 HDFS 上。 本案例的完整代码如下所示 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.PrimitiveObjectInspector; import org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectInspectorFactory;public class AddTest extends GenericUDF {Overridepublic ObjectInspector initialize(ObjectInspector[] objectInspectors) throws UDFArgumentException {// 1.校验参数个数if (objectInspectors.length ! 2) {throw new UDFArgumentException(参数个数有误);}// 2.检查第1个参数是否是int类型// 判断第1个参数的基本类型ObjectInspector num1 objectInspectors[0];if (num1.getCategory() ! ObjectInspector.Category.PRIMITIVE) {throw new UDFArgumentException(第1个参数不是基本数据类型);}// 第1个参数类型判断PrimitiveObjectInspector temp (PrimitiveObjectInspector) num1;if (PrimitiveObjectInspector.PrimitiveCategory.INT ! temp.getPrimitiveCategory()) {throw new UDFArgumentException(第1个参数应为INT类型);}// 2.检查第2个参数是否是int类型// 判断第2个参数的基本类型ObjectInspector num2 objectInspectors[1];if (num2.getCategory() ! ObjectInspector.Category.PRIMITIVE) {throw new UDFArgumentException(第2个参数不是基本数据类型);}// 第2个参数类型判断PrimitiveObjectInspector temp2 (PrimitiveObjectInspector) num2;if (PrimitiveObjectInspector.PrimitiveCategory.INT ! temp2.getPrimitiveCategory()) {throw new UDFArgumentException(第2个参数应为INT类型);}// 3.设置函数返回值类型返回一个整型数据return PrimitiveObjectInspectorFactory.javaIntObjectInspector;}Overridepublic Object evaluate(DeferredObject[] deferredObjects) throws HiveException {// 完成两数相加的逻辑计算int num1 Integer.parseInt(deferredObjects[0].get().toString());int num2 Integer.parseInt(deferredObjects[1].get().toString());return num1 num2;}Overridepublic String getDisplayString(String[] strings) {return getStandardDisplayString(AddTest, strings);}}7.注册 UDF 函数并测试 进入 Hive 中对创建的 UDF 函数进行注册。 如果你期间修改了 JAR 包并重新上传则需要重启与 Hive 的连接建立新的会话才会生效。 -- 永久注册 create function testAdd as AddTest using jar hdfs://hadoop201:8020/test/MyUDF-1.0-SNAPSHOT-jar-with-dependencies.jar;-- 删除注册的函数 drop function if exists testAdd;testAdd注册的 UDF 函数名称。 as AddTest编写的 UDF 函数全类名。 using jar指定 JAR 包的全路径。 注册成功后如下所示 测试 select testAdd(1,2);如果输入错误的数据类型会进行报错提示 返回复杂的数据类型 在更多的场景下我们可能有多个返回值那么该如何定义与配置呢 这里还是通过上面的两数相加的案例来进行说明套下面的模板使用 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 org.apache.hadoop.hive.serde2.objectinspector.PrimitiveObjectInspector; import org.apache.hadoop.hive.serde2.objectinspector.primitive.PrimitiveObjectInspectorFactory;import java.util.ArrayList;public class AddTestReturnList extends GenericUDF {Overridepublic ObjectInspector initialize(ObjectInspector[] objectInspectors) throws UDFArgumentException {// 1.校验参数个数if (objectInspectors.length ! 2) {throw new UDFArgumentException(参数个数有误);}// 2.检查第1个参数是否是int类型// 判断第1个参数的基本类型ObjectInspector num1 objectInspectors[0];if (num1.getCategory() ! ObjectInspector.Category.PRIMITIVE) {throw new UDFArgumentException(第1个参数不是基本数据类型);}// 第1个参数类型判断PrimitiveObjectInspector temp (PrimitiveObjectInspector) num1;if (PrimitiveObjectInspector.PrimitiveCategory.INT ! temp.getPrimitiveCategory()) {throw new UDFArgumentException(第1个参数应为INT类型);}// 2.检查第2个参数是否是int类型// 判断第2个参数的基本类型ObjectInspector num2 objectInspectors[1];if (num2.getCategory() ! ObjectInspector.Category.PRIMITIVE) {throw new UDFArgumentException(第2个参数不是基本数据类型);}// 第2个参数类型判断PrimitiveObjectInspector temp2 (PrimitiveObjectInspector) num2;if (PrimitiveObjectInspector.PrimitiveCategory.INT ! temp2.getPrimitiveCategory()) {throw new UDFArgumentException(第2个参数应为INT类型);}// 3.设置函数返回值类型返回一个键值对数据ArrayListString structFieldNames new ArrayList();ArrayListObjectInspector structFieldObjectInspectors new ArrayList();structFieldNames.add(result);structFieldObjectInspectors.add(PrimitiveObjectInspectorFactory.javaStringObjectInspector);return ObjectInspectorFactory.getStandardStructObjectInspector(structFieldNames, structFieldObjectInspectors);}Overridepublic Object evaluate(DeferredObject[] deferredObjects) throws HiveException {// 完成两数相加的逻辑计算ArrayListInteger arrayList new ArrayList();int num1 Integer.parseInt(deferredObjects[0].get().toString());int num2 Integer.parseInt(deferredObjects[1].get().toString());arrayList.add(num1 num2);return arrayList;}Overridepublic String getDisplayString(String[] strings) {return getStandardDisplayString(AddTestReturnList, strings);}}退出当前与 Hive 的连接建立新的连接刷新缓存 同样的打包上传到 HDFS 上进行注册 create function AddTestReturnList as AddTestReturnList using jar hdfs://hadoop201:8020/test/MyUDF-1.0-SNAPSHOT-jar-with-dependencies.jar;此时可能会发生报错这是由于我们之前已经加载过该 JAR 包了再次加载时 Hive 会抛出异常我们可以通过下面的语句进行调整 -- 关闭向量化查询 set hive.vectorized.execution.enabledfalse;重新注册即可。 进行测试 select AddTestReturnList(1,2);计算结果如下 是不是轻松拿捏了~
http://www.zqtcl.cn/news/341890/

相关文章:

  • 怎么自己做网站排名福州朝阳房产网站建设
  • 贵州建网站红动中国免费素材网
  • 公益网站建设婚庆网站开发的意义
  • 徐州网站建设案例南京设计网站
  • 培训网站欣赏网站开发进度管理表
  • 网站开发工程师考试平面设计实例网站
  • ftp更换网站备案密码如何登录添加网站
  • 钢球 东莞网站建设做网站用vue吗
  • 青岛网站建设制作公司制作视频软件哪个免费
  • 用flash做的网站欣赏承德住房和城乡建设局网站关闭了
  • 做网站引流的最佳方法施工企业高级工程师土建答辩
  • 成都优创智汇网站建设旅游网站网页设计代码
  • 郑州冬青街 网站建设网站seo技巧
  • 网站定制公司推荐外包公司怎么样
  • 深圳做网站要网站制作能在家做吗
  • 设计国外网站深圳外贸网站推广
  • wordpress首页文章分类展示站长工具seo综合查询引流
  • 整网站代码 带数据 免费 下载株洲网站的建设
  • 邢台学校网站建设价格个人博客首页
  • php做网站优势wordpress导航图片尺寸
  • 西安商城网站建设咪豆com域名表示的是什么机构
  • 网站如何申请微信支付接口织梦中英文网站源码
  • 礼县住房和城乡建设局网站化妆品的网站设计方案
  • 做外汇网站代理公关团队
  • wordpress登录页面创建seo网站平台
  • 兰州seo整站优化服务商企业网站seo优化方案
  • 高校网站建设管理制度Wordpress动图主题
  • 手机ui设计网站自己做传奇网站
  • 长春网站建设吉网传媒实力牜网站pv是什么意思
  • 西安网站建设培训班无锡seo报价