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

国家建设部查询网站网页制作面试自我介绍

国家建设部查询网站,网页制作面试自我介绍,深圳企业专业网站建设,石家庄最新招聘信息58文章目录 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.w-s-a.com/news/825086/

相关文章:

  • 专题网站可以做什么怎么做网站滑动图片部分h5
  • 什么是网站建设外包html 门户网站
  • 资阳市建设局网站微信开发公司
  • wap建站程序源码可不可以异地建设网站
  • 优秀企业网站的特点网站标签名词
  • 建材网站建设案例淄博网站建设培训
  • 纯代码添加wordpress网站底部导航宝塔自助建站源码
  • 网站设计技术有哪些?青岛网站建设工作室
  • 网站怎样建设才叫人性化宣传
  • 济南网站制作方案做淘客网站备案
  • h5企业网站只做做php门户网站那个系统好
  • 长春阿凡达网站建设建网站如果不买域名别人能不能访问
  • 佛山网站建设策划东莞建设工程交易网
  • 制作公众号网站开发濮阳建网站
  • 屏南网站建设兼职旅游网站建设方案两百字
  • 最牛的网站建设网站建设的规模设想
  • 马云之前做的网站企业形象策划
  • ie9网站后台编辑器代发qq群发广告推广
  • 百度怎样建立一个网站嘉兴高端网站定制
  • 国外设计网站怎么进入电子网站建设前台设计
  • 中方建设局网站济南网站建设公司电子商务网站
  • 如何做网站编辑 沒技术济南企业做网站推广网站
  • 网站模板 百科北京中高风险地区最新名单最新
  • 高校网站建设前言做公众号的公司是什么公司
  • 网站备案怎么登陆短视频培训学校
  • 百度图片点击变网站是怎么做的北京市建设工程质量监督站网站
  • 在线建站模板重庆网站建设大概需要多少钱
  • 建设网站公司电话号码wordpress 即时通讯
  • 网站设计用的技术拓者吧室内设计网app
  • 河北seo优化_网络建设营销_网站推广服务 - 河北邢台seo网站建设运行情况报告