一、explode
1、官网解析
把一个数组转换成多行
2、创建表hive_wc,字段sentence存放句子
create table hive_wc(sentence string);
load data local inpath '/opt/data/hive-wc.txt' into table hive_wc;
3、求每个单词出现的个数
思路:
(1)获取每个单词split(sentence,',')
(2)将单词划分成一行一列方便统计explode()
select explode(split(sentence,',')) from hive_wc;
(3)统计
select word,count(1) as c from
(select explode(split(sentence,',')) as word from hive_wc) t group by word;
二、处理JSON数据
1、创建一张表
create table rating_json(json string);
load data local inpath '/opt/data/rating.json' into table rating_json;
2、查看官网(https://cwiki.apache.org/confluence/display/Hive/LanguageManual+UDF)
select a.timestamp, b.*
from log a lateral view json_tuple(a.appevent,
'eventid'
,
'eventname'
) b as f1, f2;
参数为一组键k1,k2……和JSON字符串,返回值的元组。该方法比 get_json_object
高效,因为可以在一次调用中输入多个键
select json_tuple(json,"movie","rate","time","userid") as (movie,rate,time,userid) from rating_json limit 10;
总结:
(1)json_tuple(字段名,字段值中需要分开的值1,字段值中需要分开的值2......);
(2)as f1,f2;将字段值中需要分开的值1,字段值中需要分开的值2......重命名;
作业:
1)时间类型转换
input
1193 5 978300760
661 3 978302109
output
1193 5 2001 12 1 2001-12-01
三、top n问题
1、HIve创建新表,导入文件夹的数据
create table hive_rownumber(id int,age int,name string,sex string)
row format delimited fields terminated by '\t';
load data local inpath '/opt/data/hive_row_number.txt' into table hive_rownumber;
2、出现问题
3、将建表的分隔符改为,
create table hive_rownumber(id int,age int,name string,sex string)
row format delimited fields terminated by ',';
load data local inpath '/opt/data/hive_row_number.txt' into table hive_rownumber;
需求:
查询出每种性别总年龄最大的2条记录
4、窗口函数
ROW_NUMBER()
说明:返回结果集分区内行的序列号,每个分区的第一行从 1 开始。
语法:ROW_NUMBER () OVER ([ <partition_by_clause>]<order_by_clause> ) 。
备注:ORDERBY 子句可确定在特定分区中为行分配唯一 ROW_NUMBER 的顺序。
参数:<partition_by_clause> :将FROM 子句生成的结果集划入应用了 ROW_NUMBER 函数的分区。
<order_by_clause>:确定将 ROW_NUMBER 值分配给分区中的行的顺序。
返回类型:bigint 。
select id ,age,name,sex
from
(select id ,age,name,sex,row_number() over (partition by sex order by age desc) as rank from hive_rownumber) as t
where rank <=2 ;
四、UDF函数(User-Defined Functions:用户自定义函数)
UDF:一进一出(进来一条记录,出去一条记录):upper lower substring 函数
UDAF:Aggregation 多进一出:count max min sum...
UDTF:Table-Generation 一进多出
Maven+HDFS
1、创建Maven项目
2、删除
3、添加
4、添加版本依赖
自定义函数的步骤:
(1)新建一个class,继承UDF
直接找到org.apache.hadoop.ql.exec按确认
(2)研究UDF类
功能:输入xxx,输出hello,xxx,要引用
public Text evaluate(String a)
(3)建立main函数,创建对象
(4)输出结果
(5)打包
jar包在文件夹
(6)上传到服务器
(7)修改所属权组
chown -R HBinz:HBinz hive-1.0-SNAPSHOT.jar
三、hive使用自定义UDF函数
1、打开官网
2、创建自定义函数的语法
CREATE TEMPORARY FUNCTION sayHello AS 'com.ruozedata.bigdata.HelloUDF';
PS:仅对当前session优先
3、将jar包添加到hive,让hive可以使用
add JAR[S] <filepath> <filepath>*
add jar /opt/lib/hive-1.0-SNAPSHOT.jar;
------------也可以在HIVE目录下创建文件夹存放jar包,就不用每次add了---------
4、hive执行上述命令
5、hive上查看方法是否存在sayHello方法
show functions;
(6)其他窗口都可以使用funciton
语法:
CREATE FUNCTION [db_name.]function_name AS class_name [USING JAR|FILE|ARCHIVE 'file_uri' [, JAR|FILE|ARCHIVE 'file_uri'] ];
CREATE FUNCTION sayRuozeHello2 AS 'com.ruozedata.bigdata.HelloUDF'
USING JAR 'hdfs://hadoop002:9000/lib/hive-1.0-SNAPSHOT.jar';
'file_uri':HDFS上的目录
default.sayruozehello函数创建成功。
永久函数是以:库名.函数名的存在,同库使用的时候可以直接用函数名,不同库使用的时候需要带上库名
(7)在HDFS上创建目录
hdfs dfs -mkdir /lib
hdfs dfs -put hive-1.0-SNAPSHOT.jar /lib
(8)执行
CREATE FUNCTION sayRuozeHello2 AS 'com.ruozedata.bigdata.HelloUDF'
USING JAR 'hdfs://hadoop002:9000/lib/hive-1.0-SNAPSHOT.jar';
(9)其他窗口都可以
(10)到metastore查看
查看数据库名称:
登陆数据库:
su - mysqladmin
mysql -uroot -p123456
show databases;
use hbinz001;
show tables;
select * from funcs;
四、了解UDF默认function的机制
1、IDEA查类
2、FunctionRegistry类的方法
与HIVE默认的UDF一样
3、引申出以后可以重写自定义UDF
4、注释间的对应
hive命令:
源码注释: