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就能看到如何使用,使用举例等。