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

公司设计网站推荐seo课程培训班

公司设计网站推荐,seo课程培训班,为什么用花生壳做的网站老刷新,上海猎头公司招聘信息Hive之扩展函数(UDF) 1、概念讲解 当所提供的函数无法解决遇到的问题时,我们通常会进行自定义函数,即:扩展函数。Hive的扩展函数可分为三种:UDF,UDTF,UDAF。 UDF:一进一出 UDTF:一进多出 UDAF&#xff1a…

Hive之扩展函数(UDF)

1、概念讲解

当所提供的函数无法解决遇到的问题时,我们通常会进行自定义函数,即:扩展函数。Hive的扩展函数可分为三种:UDF,UDTF,UDAF

UDF:一进一出

UDTF:一进多出

UDAF:多进一出

2、UDF的基本实现

业务功能介绍

此处创建的UDF业务功能介绍:给定三个参数,参数一和参数二为日期,参数三为不同维度(年,季度,月,周,日)。根据不同维度计算两日期之间相差的值。

一:依赖

<dependency><groupId>org.apache.hive</groupId><artifactId>hive-exec</artifactId><version>3.1.2</version>
</dependency>

二:接口的定义

UDF基本接口定义
import org.apache.hadoop.hive.ql.exec.UDFArgumentException;
import org.apache.hadoop.hive.serde2.objectinspector.ObjectInspector;import java.util.Objects;//校验:若无法匹配,则抛异常
public interface UDFCom {//校验传参的数量与元素default void validateArgs(Object[] args,int size) throws UDFArgumentException {//校验 数量 是否为空if (size>0 && Objects.isNull(args) || args.length<size){throw new UDFArgumentException(size+"args must be provided");}//size 之内的元素进行验证for (int i=0 ;i < size ; i++){if (Objects.isNull(args[i])){throw new UDFArgumentException("type of args["+i+"] null");}}}//校验所有类型为基本类型default void validateAllPrimitiveArgs(Object[] args,int size) throws UDFArgumentException{for (int i = 0; i < size; i++) {// ObjectInspector: 解析并获取内部数据结构信息的工具// getCategory():提取类型// PRIMITIVE:基本类型if (((ObjectInspector)args[i]).getCategory() != ObjectInspector.Category.PRIMITIVE){throw new UDFArgumentException("only support primitive type");}}}
}
日期接口定义(业务需求)
import org.apache.hadoop.hive.ql.metadata.HiveException;//校验:若无法匹配,则抛异常
public interface DateCom {//日期的格式验证default void validateDateFormat(String...dateStrArr) throws HiveException {for (String s : dateStrArr) {if (!s.matches("\\d{4}-(0?[1-9]|1[0-2])-(0?[1-9]|[1-2][0-9]|3[0-1])")){throw new HiveException("date format illegal : " + s);}}}
}

三:方法的实现

package com.ybg.hive.ql.func.udf;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.primitive.PrimitiveObjectInspectorFactory;import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Objects;public class UDFDataDiffByUnit extends GenericUDF implements UDFCom, DateCom {//管理参数的【类型】 => 验证@Overridepublic ObjectInspector initialize(ObjectInspector[] arguments) throws UDFArgumentException {//验证validateArgs(arguments,2);// 验证参数数量及元素validateAllPrimitiveArgs(arguments,2);// 验证类型是否为基本类型return PrimitiveObjectInspectorFactory.javaStringObjectInspector;// 传进来参数为字符串}//管理参数的【值】 => 验证 + 业务@Overridepublic Object evaluate(DeferredObject[] arguments) throws HiveException {/*** 验证*/validateArgs(arguments,2);//验证数量/*** 业务功能*/String strDateSmall = arguments[0].get().toString();//获取【参数一】的日期String strDateBig = arguments[1].get().toString();//获取【参数二】的日期//日期格式的验证validateDateFormat(strDateSmall,strDateBig);//比较日期大小:规定 前面日期 < 后面日期SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");Calendar dateSmall = Calendar.getInstance();Calendar dateBig = Calendar.getInstance();try {dateSmall.setTime(sdf.parse(strDateSmall));dateBig.setTime(sdf.parse(strDateBig));} catch (ParseException e) {throw new HiveException(e);}if (dateSmall.after(dateBig)){throw new HiveException("dateSmall by arg1 > dateBig by arg2");}//根据不同情况进行计算String unit = arguments[2].get().toString().toLowerCase();int intUnit = 0;switch (unit){case "y":// 2019-10-15  2020-8-15intUnit = Calendar.YEAR;break;case "q": case "m":intUnit = Calendar.MONTH;break;case "w": case "d":intUnit = Calendar.DATE;break;default:throw new HiveException("not support unit by arg3 : " + unit);}int diff = -1;while (true){diff++;dateSmall.add(intUnit,1);if (dateSmall.after(dateBig)) {//结束的标志break;}}switch (unit){case "q":diff/=3;break;case "w":diff/=7;break;}return diff;}@Overridepublic String getDisplayString(String[] children) {return Objects.isNull(children) || children.length==0 || null == children[0] ? null : children[0];}
}

四:打jar包上传至HDFS

第一步:打执行jar包,选择选择 package 选项。

第二步:找到jar包的物理磁盘位置(右键点击jar包 => Open in => Explorer)
第三步:将jar包上传至HDFS

五:创建 hive udf 映射至hdfs jar包并指定主类

基本语法

全包路径:右键 => copy path => copy reference

create function fl_day as '继承了GenericUDF的全包路径'
using jar 'hdfs上的jar包的路径';

实际运用

-- 创建连接
create function uud as 'com.ybg.hive.ql.func.udf.UDFDataDiffByUnit'
using jar 'hdfs://single:9000/hive/udf/hiveudf-2.3.jar';
-- 测试
select uud('2018-8-15','2020-8-15',"q") as quarterDiff

六:后期更新函数

第一步:先删函数drop function if exists 函数名;
第二步:关闭连接File -> Close Project
第三步:重新注入create function uud as 'com.ybg.hive.ql.func.udf.UDFDataDiffByUnit'using jar 'hdfs://single:9000/hive/udf/hiveudf-1.0-SNAPSHOT.jar';
http://www.yayakq.cn/news/553554/

相关文章:

  • 企业网站建设选题依据免费推广网站在线观看
  • 最早做弹幕的网站做我女朋友程序网站
  • 东莞企业网站找谁wordpress wp admin
  • 北京网站建设公司报价浩森宇特静态网站更新
  • 电子商务网站建设基础考试北京壹零零壹网站建设
  • 做酒招代理的网站IT周末做网站违反制度么
  • 雄安专业网站建设公司2017网站建设公司排名
  • 114啦建站程序网站首页制作方案
  • 上海网站建设 微信开发公司哪家好app智能开发
  • 网站源码如何保存如何建立一个免费网站
  • 网站开发提供的服务建微信网站
  • 东莞高端模板建站从零开始做网站内容运营
  • 东莞百度网站排名优化北京网站设计与制作
  • 能进封禁网站的手机浏览器大学生网站开发大赛
  • 网站建设方案策划书前言网站建设设计基础
  • 胖哥食品网站建设规范意见天猫网站建设的目的
  • 建筑资料免费下载网站秦皇岛庆云网站建设
  • 电子商务网站软件平台公司注册资金500万
  • 网站会员后台百度推广点击一次多少钱
  • 微信网站开发技术网站规划有什么意义
  • 网页设计培训推荐seo与sem的区别和联系
  • 湖北省建设信息港网站只有域名如何做网站
  • 网站编程培训班学生网页设计主题
  • 阿里云域名购买官网广州优化网站关键词
  • 开发者门户网站是什么意思如何开跨境电商店铺
  • 电脑搭建网站步骤免费发广告平台
  • 银行内部网站建设建议免费网站推广网址
  • 汉口网站建设制作企业大黄页
  • 重庆招聘网站建设数学很差能学计算机吗
  • 南宁网站排名优化公司中国工商信息查询网