Hive之UDF解释

UDF全称:

  • user defined function 用户定义函数

存在的意义: 

  • 比如你需要使用hive的函数来处理一些记录,像count(), sum()这都是内置的,写好的,如果我想自定义一些函数,就可以写UDF来完成,相当于在Hive的sql中自定义了一些函数
  • UDF必须使用java编写,因为Hive本身是用java编写的.

UDF类别:

  • 普通 UDF (操作作用于单个数据的行记录,并且产生一个新的数据行记录作为输出,比如数字函数,字符串函数), (输出一条记录,输出一条记录)
  • 用户定义聚集函数 UDAF (接受多个输入的数据行,并产生一个数据行,比如count(),sum(),max()), (输入多条记录,输出一条记录)
  • 用户定义表生成函数 UDTF (操作一个数据行记录,并且产生多个数据行,多个数据行作为一个新的table作为输出)

一个UDF必须满足两个条件:

  • 必须是org.apache.hadoop.hive.ql.exec.UDF的子类
  • 至少实现了exaluate()方法
  • 注意UDF名不区分大小写

一个UDAF计算函数必须实现五个条件:

  • init()方法 主要负责初始化计算函数并重设它的内部状态. 在MaximumIntUDAFEvaluator中,我们把存放最终结果的IntWritable对象设置为null.我们使用null来表示目前还没有对任何值进行聚集计算,这和对空集null计算最大值应有的结果是一致的
  • iterate()方法 每次对一个新值进行聚集计算时都会调用iterate()方法.计算函数要根据聚集计算的结果更新其内部状态.iterate()接受的参数和Hive中被调用函数的参数是对应的.
  • terminatePartial()方法 Hive需要部分聚集结果时会调用terminatePartial()方法.这个方法必须返回一个封装了聚集计算当前状态的对象.
  • merge()方法 在Hive决定要合并一个部分聚集值和另一个部分聚集值时会调用merge()方法.该方法接受一个对象作为输入.这个对象的类型必须和terminatePartial()方法返回的类型一致.
  • terminate()方法 Hive需要最终聚集结果时会调用terminate()方法,计算函数需要把状态作为一个值返回.

写一个UDF

  • 后续补充

把写好的UDF放到Hive中去使用

  • 将用java写好的UDF函数编译后的Java类打包为一个JAR文件,并在Hive中注册这个文件
  • hive>add jar /path/test.jar;
  • hive>create temporary function strip as 'com.hadoop.hive.Strip';  //给写好的UDF中的Strip类起一个别名
  • hive>select strip("test") from table1;    //使用UDF

暂时就写到这里,参考:

  • https://blog.csdn.net/yqlakers/article/details/70211522

猜你喜欢

转载自www.cnblogs.com/blogyuhan/p/9298397.html