1.hive内置函数
hive的内置函数有很多,大部分和mysql的一样,就不在详细介绍了。主要介绍一下自定义函数
和具体的案例。
①WordCount案例
使用hive sql语句实现WordCount。
创建数据表
create table docs(line string);
创建结果表
create table wc(word string, totalword int);
加载数据
load data local inpath '/tmp/wc' into table docs; //注意:这个本地指的是hive工具所在的那个节点
统计wordcount并且将数据插入到结果表中
from (select explode(split(line, ' ')) as word from docs) w
insert into table wc
select word, count(1) as totalword
group by word
order by word;
②自定义UDF函数(User Defined Function)
UDF函数的特点:计算一条数据,输出一条数据。
UDF函数的实现流程:首先根据需求自己写一个函数,这个函数要继承UDF,并且类名中不要有下划线等特殊字
符。然后将这个函数打成一个jar包,把它上传到hive的lib下,在hive shell中执行
add jar /opt/software/hive/hive-1.2.1/lib/FormatTimeUDF.jar;
然后再执行CREATE TEMPORARY FUNCTION convertTime AS 'com.hoe.hive.userdefinedfunction.FormatTimeUDF';
手动创建一个函数。然后就可以在SQL语句中使用这个函数了。
③自定义UDAF函数(User Defined Aggregate Function)
UDAF函数的特点:是一个聚合函数。输入多条,输出一条。
UDAF函数案例:函数需求:根据某一字段分组,把组内的数据用“\t”拼接起来。
具体代码:
public final class ReduceTimeByResponseNumUDAF extends UDAf {
public static class UDAFExampleAvgEvaluator implements UDAFEvaluator {
StringBuilder builder = null;
//每个task都会调用一次
public UDAFExampleAvgEvaluator() {
init();
}
//初始化方法
public void init(){
builder = new StringBuilder();
}
//map端的聚合逻辑 combiner
public boolean iterate(String o){
if(o != null){
builder.append(o + "\t");
}
return true;
}
//map端聚合结果
public String terminatePartial(){
return builder.toString();
}
//reduce端大合并逻辑
public boolean merge(String o){
iterate(o);
return true;
}
//大合并的结果
public String terminate(){
return builder.toString();
}
}
}
将代码打成jar包,在hive shell中执行
add jar /opt/software/hive/hive-1.2.1/lib/ReduceTimeByResponseNumUDAF.jar;
然后再执行CREATE TEMPORARY FUNCTION rrd AS 'com.hoe.hive.userdefinedfunction.ReduceTimeByResponseNumUDAF';
然后就可以在SQL语句中使用这个函数了。注意创建的函数都是临时函数,推出hive shell后,就
不能再使用了。
删除函数执行:DROP TEMPORARY FUNCTION 函数名;
④永久函数(退出hive shell后再进来还能使用)
实现方法:将相应的jar包上传到HDFS上。在创建函数的时候使用
create function formatTime AS 'com.hoe.hive.userdefinedfunction.FormatTimeUDF' using jar 'hdfs://zfg/test/FormatTimeUDF.jar';
⑤小区掉话率案例
实现思路:根据基站号分组,统计组内总的掉话的秒数和总的通话持续秒数。然后两者相除就
是掉话率。
create table cell_monitor( //创建数据表
record_time string, //通话时间
imei string, //基站编号
cell string, //手机编号
ph_num int,
call_num int,
drop_num int, //掉话的秒数
duration int, //通话持续总秒数
drop_rate DOUBLE,
net_type string,
erl string
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
create table cell_drop_monitor( //创建结果表
imei string, //基站号
total_call_num int, //总的通话持续秒数
total_drop_num int, //总的掉话秒数
d_rate DOUBLE //掉话率
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY '\t';
truncate table cell_monitor; //清空表数据
LOAD DATA LOCAL INPATH '/root/cdr_summ_imei_cell_info.csv' OVERWRITE INTO TABLE cell_monitor; //加载数据
//计算掉话率
from cell_monitor cm
insert overwrite table cell_drop_monitor
select cm.imei,sum(cm.duration) ,sum(cm.drop_num),sum(cm.drop_num)/sum(cm.duration) d_rate
group by cm.imei
sort by d_rate desc;
2.hive思维导图