[Hive_12] Hive 的自定义函数


0. 说明

  UDF   //user define function
      //输入单行,输出单行,类似于 format_number(age,‘000‘)

  UDTF   //user define table-gen function
         //输入单行,输出多行,类似于 explode(array);

  UDAF   //user define aggr function
         //输入多行,输出单行,类似于 sum(xxx)

  Hive 通过 UDF 实现对 temptags 的解析


1. UDF

  1.1 代码示例

  Code

  1.2 用户自定义函数的使用

  1. 将 Hive 自定义函数打包并发送到 /soft/hive/lib 下
  2. 重启 Hive
  3. 注册函数

# 永久函数
  create function myudf as ‘com.share.udf.MyUDF‘;

# 临时函数
  create temporary function myudf as ‘com.share.udf.MyUDF‘;

  1.3 Demo

  Hive 通过 UDF 实现对 temptags 的解析

  0. 准备数据

  1. 建表

    create table temptags(id int,json string) row format delimited fields terminated by ‘\t‘;

  2. 加载数据

    load data local inpath ‘/home/centos/files/temptags.txt‘ into table temptags;

  3. 代码编写

  Code

  4. 打包

  5. 添加 fastjson-1.2.47.jar & myhive-1.0-SNAPSHOT.jar 到 /soft/hive/lib 中

  6. 重启 Hive

  7. 注册临时函数

    create temporary function parsejson as ‘com.share.udf.ParseJson‘;

  8. 测试

select id ,parsejson(json) as tags from temptags;
# 将 id 和 tag 炸开
select id,  tag from temptags lateral view explode(parsejson(json)) xx as tag;

# 开始统计每个商家每个标签个数
select id, tag, count(*) as countfrom (select id,  tag from temptags lateral view explode(parsejson(json)) xx as tag) agroup by id, tag;

# 进行商家内标签数的排序
select id, tag , count, row_number()over(partition by id order by count desc) as rankfrom  (select id, tag, count(*) as count from (select id,  tag from temptags lateral view explode(parsejson(json)) xx as tag) agroup by id,tag) b ;

# 将标签和个数进行拼串,取得前 10 标签数
select id, concat(tag,‘_‘,count)from (select id, tag , count, row_number()over(partition by id order by count desc) as rank from  (select id, tag, count(*) as count from (select id,  tag from temptags lateral view explode(parsejson(json)) xx as tag) agroup by id,tag) b )cwhere rank<=10;

#聚合拼串
    //concat_ws(‘,‘, List<>)
    //collect_set(name) 将所有字段变为数组,去重
    //collect_list(name) 将所有字段变为数组,不去重
select id, concat_ws(‘,‘,collect_set(concat(tag,‘_‘,count))) as tagsfrom (select id, tag , count, row_number()over(partition by id order by count desc) as rankfrom  (select id, tag, count(*) as count from (select id,  tag from temptags lateral view explode(parsejson(json)) xx as tag) agroup by id,tag) b )c  where rank<=10 group by id;

  1.4 虚列:lateral view

  123456 味道好_10,环境卫生_9

  id   tags
  1   [味道好,环境卫生]   =>   1 味道好
                      1 环境卫生

select name, workplace from employee lateral view explode(work_place) xx as workplace;



[Hive_12] Hive 的自定义函数

原文地址:https://www.cnblogs.com/share23/p/10355846.html

时间: 2024-09-30 06:17:44

[Hive_12] Hive 的自定义函数的相关文章

Hive(9)-自定义函数

一. 自定义函数分类 当Hive提供的内置函数无法满足你的业务处理需要时,此时就可以考虑使用用户自定义函数. 根据用户自定义函数类别分为以下三种: 1. UDF(User-Defined-Function) 一进一出 2. UDAF(User-Defined Aggregation Function) 聚集函数,多进一出, 类似于:count/max/min 3. UDTF(User-Defined Table-Generating Functions) 一进多出 如lateral view e

HIVE 编写自定义函数UDF

一 新建JAVA项目 并添加 hive-exec-2.1.0.jar 和hadoop-common-2.7.3.jar hive-exec-2.1.0.jar 在HIVE安装目录的lib目录下 hadoop-common-2.7.3.jar在hadoop的安装目录下的\share\hadoop\common 二 编一个一个类并继承UDF 并重写evaluate方法 下面以rownum为例 package com.udf; import org.apache.hadoop.hive.ql.exec

Hive自定义函数UDAF开发

Hive支持自定义函数,UDAF是接受多行,输出一行. 通常是group by时用到这种函数. 其实最好的学习资料就是官方自带的examples了. 我这里用的是0.10版本hive,所以对于的examples在 https://github.com/apache/hive/tree/branch-0.10/contrib/src/java/org/apache/hadoop/hive/contrib/udaf/example 我这里的功能需求是: actionCount(act_code,ac

Hive自定义函数(UDF、UDAF)

当Hive提供的内置函数无法满足你的业务处理需要时,此时就可以考虑使用用户自定义函数. UDF 用户自定义函数(user defined function)–针对单条记录. 创建函数流程 1.自定义一个Java类 2.继承UDF类 3.重写evaluate方法 4.打成jar包 6.在hive执行add jar方法 7.在hive执行创建模板函数 8.hql中使用 Demo01: 自定义一个Java类 package UDFDemo; import org.apache.hadoop.hive.

Hive自定义函数的学习笔记(1)

前言: hive本身提供了丰富的函数集, 有普通函数(求平方sqrt), 聚合函数(求和sum), 以及表生成函数(explode, json_tuple)等等. 但不是所有的业务需求都能涉及和覆盖到, 因此hive提供了自定义函数的接口, 方便用户扩展. 自己好像很久没接触hadoop了, 也很久没博客了, 今天趁这个短期的项目, 对hive中涉及的自定义函数做个笔记. 准备: 编写hive自定义函数前, 需要了解下当前线上hive的版本. hive --vesion 比如作者使用到的hive

Hive自定义函数UDF示例

简单自定义函数只需继承UDF类,然后重构evaluate函数即可 LowerCase.java: package com.example.hiveudf; import org.apache.hadoop.hive.ql.exec.UDF; public final class LowerCase extends UDF { public String evaluate(final String s) { if (s == null) { return null; } return new St

hive添加永久自定义函数

永久自定义hive函数 1:做这件事的原因: 有一些函数是比较基础的,公用的,每次都要create temporary function麻烦了,这样的基础函数需要直接集成到hive中去,避免每次都要创建. 2:步骤 本人拥有一个账户zb_test 自定义的函数已经准备好 登陆linux账户,修改该账户的home目录下的.bashrc文件: 把CLASSPATH改成如下: export CLASSPATH=$JAVA_HOME/lib:$JAVA_HOME/jre/lib:$SQOOP_HOME/

开发HIVE的UDTF自定义函数

[Author]: kwu UDTF(User-Defined Table-Generating Functions) 用来解决 输入一行输出多行(On-to-many maping) 的需求,开发HIVE的UDTF自定义函数具体步骤如下: 1.继承org.apache.hadoop.hive.ql.udf.generic.GenericUDTF,实现initialize, process, close三个方法. 2.UDTF首先会调用initialize方法,此方法返回UDTF的返回行的信息(

Hive 自定义函数

hive 支持自定义UDF,UDTF,UDAF函数 以自定义UDF为例: 使用一个名为evaluate的方法 package com.hive.custom; import org.apache.hadoop.hive.ql.exec.UDF; import org.apache.hadoop.io.IntWritable; public class XiaoUDF extends UDF { /** * 值加1000 * @param i * @return val */ public Int