Hive入门(4)

1.函数补充

(1)explode :将数组变成一列列的

(2)需求举例:求一个WC

Time taken: 1.071 seconds
hive> load data local inpath '/home/hadoop/data/hive_wc.txt' into table hive_wc;
Loading data to table default.hive_wc
Table default.hive_wc stats: [numFiles=1, totalSize=42]
OK
Time taken: 0.693 seconds
hive> select * from hive_wc;
OK
a	a	a	a	b	b	b	b	
c	c	c	d	d	d	d	e	e


这就是随便创建的一个数据格式
(1)词频统计首先拆分,然后拿到单词、
(2)然后就是累加了嘛


select word, count(1) as c 
from (select explode(split(wc,"	")) as word from hive_wc) t
group by word ;


//这里explode函数就体现了作用,将分开后的多行多列,变成了一列多行,在进行count
	3
		19
a	4
b	4
c	3
d	4
e	2
f	3
 发现复炸的SQL语句还是需要文本编辑下面写啊,有些特殊字符,在hive上是写不出来的,比如tab键

2.json文件处理

(1)需求:查询不同性别中年龄最大的2条数据

正常逻辑应该是先按性别分组,在排序,去除前俩条

select * from hive_rownumber group by sex order by age limit 2;

但是上面这句话是不能通过的,因为排序是全局排序的,不能对分组后的结果排序的。

(2)分析函数row_number() over()

select id,name,age,sex from (select id,name,age,sex,row_number() over(partition by sex 
order by age desc) as ww from hive_rownumber)t
where ww <=2;



//as这个别名是为了下面的,where条件而用的,  t这个别名是因为在嵌套查询中,对面结果表操作时,要加个别名

3.Hive  UDF函数

3.1基本概念

(1)概述:前面我们学习的都是Hive中的内置函数,然而在工作中很多需求内置函数是不能满足需求的,因此需要我们自定义函数

(2)常见的UDF函数

         1)UDF:一进一出,像upped lower等

         2)UDAF:多进一出Aggregation,像count,max,min等聚合函数

         3)UDTF:Table-Generation 

3.2开发步骤    (IDEA+maven)

(1)添加相关的依赖

         <!--Hive自定义开发添加hive相关依赖-->
        <dependency>
            <groupId>org.apache.hive</groupId>
            <artifactId>hive-exec</artifactId>
            <version>${hive.version}</version>
        </dependency>
 
              <!--Hive自定义开发添加hadoop相关依赖-->
        <dependency>
            <groupId>org.apache.hadoop</groupId>
            <artifactId>hadoop-common</artifactId>
            <version>${hadoop.version}</version>
        </dependency>

(2)首先定义一个类extends UDF

(3)然后就能开始逻辑开发了

(4)完成之后打包上传

(5)进入Hive界面

add jar /home/hadoop/lib/Hive-1.1.0SayHello.jar.jar
;
list jars;  //查看你刚添加的jar包
CREATE TEMPORARY FUNCTION sayHello AS 'Hive_UDF.HelloUDF';	
show   funcitons;
TEMPORARY这是这是个临时的方法啊,可以查看你的方法,全是英文小写的



每次都使用都添加jar包岂不麻烦死,所以
在Hive 目录下创建一个目录 


mkdir auxlib
然后jar添加到这个目录下面去,就能直接create function了,这要注意一个问题,mysql-connector 的jar包冲突

(6)使用举例

    > select sayhello("ruoze","laoj") from emp;
OK
Hello:ruoze:laoj
Hello:ruoze:laoj
Hello:ruoze:laoj
Hello:ruoze:laoj
Hello:ruoze:laoj
Hello:ruoze:laoj
Hello:ruoze:laoj
Hello:ruoze:laoj


函数和表之间是什么关系?函数都是遍历所有表的吗?

3.3如何创建永久的function呢?

(1)将你编译好的包放到hdfs上

(2)创建语句

CREATE FUNCTION sayRuozeHello AS 'Hive_UDF.HelloUDF'
USING JAR 'hdfs://192.168.137.251:9000/lib/Hive-1.1.0SayHello.jar.jar';    

(3)使用举例

hive> select sayruozehello("yunfei") from emp;
OK
Hello:yunfei
Hello:yunfei
Hello:yunfei
Hello:yunfei
Hello:yunfei
Hello:yunfei
Hello:yunfei
Hello:yunfei
Hello:yunfei
Hello:yunfei


为啥show functions;看不到这个方法呢?
因为这是Hive底层源码里面的FunctionRegistry里面决定的,
想要看得到,只需要在这个类里面改一下,然后重新打包Hive,就能看到了。


生产中的UDF函数,因做到像hive中的一样extend就能看到如何使用,使用举例等。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值