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 count
from (select id, tag from temptags lateral view explode(parsejson(json)) xx as tag) a
group by id, tag; # 进行商家内标签数的排序
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) a
group 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) a
group by id,tag) b )c
where rank<=10; #聚合拼串
//concat_ws(',', List<>)
//collect_set(name) 将所有字段变为数组,去重
//collect_list(name) 将所有字段变为数组,不去重
select id, concat_ws(',',collect_set(concat(tag,'_',count))) as tags
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) a
group 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;

  1.5 类找不到异常

  缺少 jar 包导致的: 类找不到异常的解决方案

  问题描述

  Caused by: java.lang.ClassNotFoundException: com.share.udf.ParseJson

  解决方案

  1. 将 fastjson 和 myhive.jar 放在 /soft/hadoop/share/hadoop/common/lib 下

  cp /soft/hive/lib/myhive-1.0-SNAPSHOT.jar /soft/hadoop/share/hadoop/common/lib/

  cp /soft/hive/lib/fastjson-1.2..jar /soft/hadoop/share/hadoop/common/lib/

  2. 同步到其他节点

  xsync.sh /soft/hadoop/share/hadoop/common/lib/fastjson-1.2..jar

  xsync.sh /soft/hadoop/share/hadoop/common/lib/myhive-1.0-SNAPSHOT.jar

  3. 重启 Hadoop 和 Hive

  stop-all.sh

  hive

2. UDTF

  2.0 说明

  Hive 实现 Word Count 通过以下两种方式

  array => explode

  string => split => explode

  现在直接通过 UDTF 实现 WordCount

  string => myudtf

  2.1 代码编写

  Code

  2.2 打包

  将 myhive-1.0-SNAPSHOT.jar 添加到 /soft/hive/lib 中

  2.3 重启 Hive

  2.4 注册临时函数

  create function myudtf as 'com.share.udtf.MyUDTF';

  2.5 测试

  

    select myudtf(line) from wc2;

  2.6 流程分析

  1. 通过 initialize的参数(方法参数)类型或参数个数

  2. 返回输出表的表结构(字段名+字段类型)

  3. 通过 process函数,取出参数值

  4. 进行处理后通过 forward函数 将其输出


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

  1. Hadoop生态圈-hive编写自定义函数

    Hadoop生态圈-hive编写自定义函数 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.

  2. Hadoop生态圈-Hive的自定义函数之UDTF(User-Defined Table-Generating Functions)

    Hadoop生态圈-Hive的自定义函数之UDTF(User-Defined Table-Generating Functions) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.

  3. Hadoop生态圈-Hive的自定义函数之UDAF(User-Defined Aggregation Function)

    Hadoop生态圈-Hive的自定义函数之UDAF(User-Defined Aggregation Function) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.

  4. Hadoop生态圈-Hive的自定义函数之UDF(User-Defined-Function)

    Hadoop生态圈-Hive的自定义函数之UDF(User-Defined-Function) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任.

  5. 【Hive】自定义函数

    Hive的自定义函数无法满足实际业务的需要,所以为了扩展性,Hive官方提供了自定义函数来实现需要的业务场景. 1.定义 (1)udf(user defined function):  自定义函数,特 ...

  6. Hive中自定义函数

    Hive的自定义的函数的步骤: 1°.自定义UDF extends org.apache.hadoop.hive.ql.exec.UDF 2°.需要实现evaluate函数,evaluate函数支持重 ...

  7. Hive中如何添加自定义UDF函数以及oozie中使用hive的自定义函数

    操作步骤: 1. 修改.hiverc文件 在hive的conf文件夹下面,如果没有.hiverc文件,手工自己创建一个. 参照如下格式添加: add jar /usr/local/hive/exter ...

  8. Hive(9)-自定义函数

    一. 自定义函数分类 当Hive提供的内置函数无法满足你的业务处理需要时,此时就可以考虑使用用户自定义函数. 根据用户自定义函数类别分为以下三种: 1. UDF(User-Defined-Functi ...

  9. 三 Hive 数据处理 自定义函数UDF和Transform

    三  Hive 自定义函数UDF和Transform 开篇提示: 快速链接beeline的方式: ./beeline -u jdbc:hive2://hadoop1:10000 -n hadoop 1 ...

随机推荐

  1. 行为型---中介者模式(Mediator Pattern)

    中介者模式的定义 中介者模式,定义了一个中介对象来封装一系列对象之间的交互关系.中介者使各个对象之间不需要显式地相互引用,从而使耦合性降低,而且可以独立地改变它们之间的交互行为.   中介者模式的结构 ...

  2. MySql常用 join 详解

    虽然这类资料比较多....我觉得还是有必要记下来,新手可以看看吧...老司机可以一眼飘过那... 常用SQL JOINS方式 1.SELECT select_list FROM TABLEA A LE ...

  3. SQL语句在数据库中可以执行在mybatis执行不了

    这个问题竟然纠结了半个小时! 就问题而言,肯定是出在mybatis中 终于,找到了答案, 原来是DataSource配置问题, 我将配置连接池的数据写到了文件db.properties中, SqlMa ...

  4. Spring Bean的生命周期相关博客

    最近得面试题一直 问 Spring 得生命周期,鉴于自己还未阅读过源码 所以只能是自己 背一波了.属实不懂硬背得作用,但是无奈被各位面试官打败了.等以后有时间了 一定要阅读几遍spring的 源码 有 ...

  5. 【Java每日一题】20170222

    20170221问题解析请点击今日问题下方的“[Java每日一题]20170222”查看(问题解析在公众号首发,公众号ID:weknow619) package Feb2017; import jav ...

  6. Java Cookie工具类

    1.Cookie跨域 Cookie不能跨顶级域名访问,但是二级域名可以共享Cookie,所以要实现跨域,有一定的局限性. 2.代码 package com.DingYu.Cookie; import ...

  7. js 小写金额转大写

    function smalltoBIG(n) { var fraction = ['角', '分']; var digit = ['零', '壹', '贰', '叁', '肆', '伍', '陆', ...

  8. JavaScript Array常用属性和方法

    Array的length属性可以通过赋值改变,但这样会导致Array原有的大小发生改变. var a = ["I", "Love", "You&quo ...

  9. P2590 [ZJOI2008]树的统计

    题目描述 一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w. 我们将以下面的形式来要求你对这棵树完成一些操作: I. CHANGE u t : 把结点u的权值改为t II. QMAX u ...

  10. dpr,ppi,dip,viewport的一些概念

    一 ppi,dpr,dip,分辨率,屏幕尺寸,设备物理像素,设备独立像素 分辨率:1920px*1080px 在这个设备上纵向上有 1920个像素点(色块)... 屏幕尺寸:5英寸(in) = 5*2 ...