第3节 hive高级用法:13、hive的函数
4.2、Hive参数配置方式
Hive参数大全:
https://cwiki.apache.org/confluence/display/Hive/Configuration+Properties
开发Hive应用时,不可避免地需要设定Hive的参数。设定Hive的参数可以调优HQL代码的执行效率,或帮助定位问题。然而实践中经常遇到的一个问题是,为什么设定的参数没有起作用?这通常是错误的设定方式导致的。
对于一般参数,有以下三种设定方式:
l 配置文件
l 命令行参数
l 参数声明
配置文件:Hive的配置文件包括
l 用户自定义配置文件:$HIVE_CONF_DIR/hive-site.xml
l 默认配置文件:$HIVE_CONF_DIR/hive-default.xml
用户自定义配置会覆盖默认配置。
另外,Hive也会读入Hadoop的配置,因为Hive是作为Hadoop的客户端启动的,Hive的配置会覆盖Hadoop的配置。
配置文件的设定对本机启动的所有Hive进程都有效。
命令行参数:启动Hive(客户端或Server方式)时,可以在命令行添加-hiveconf param=value来设定参数,例如:
bin/hive -hiveconf hive.root.logger=INFO,console
这一设定对本次启动的Session(对于Server方式启动,则是所有请求的Sessions)有效。
参数声明:可以在HQL中使用SET关键字设定参数,例如:
set mapred.reduce.tasks=100;
这一设定的作用域也是session级的。
上述三种设定方式的优先级依次递增。即参数声明覆盖命令行参数,命令行参数覆盖配置文件设定。注意某些系统级的参数,例如log4j相关的设定,必须用前两种方式设定,因为那些参数的读取在Session建立以前已经完成了。
参数声明 > 命令行参数 > 配置文件参数(hive)
五、Hive函数
5.1、内置函数
内容较多,见《Hive官方文档》
https://cwiki.apache.org/confluence/display/Hive/LanguageManual+UDF
1)查看系统自带的函数
hive> show functions;
2)显示自带的函数的用法
hive> desc function upper;
3)详细显示自带的函数的用法
hive> desc function extended upper;
5.2 Hive自定义函数
1)Hive 自带了一些函数,比如:max/min等,但是数量有限,自己可以通过自定义UDF来方便的扩展。
2)当Hive提供的内置函数无法满足你的业务处理需要时,此时就可以考虑使用用户自定义函数(UDF:user-defined function)。
3)根据用户自定义函数类别分为以下三种:
(1)UDF(User-Defined-Function)
一进一出
(2)UDAF(User-Defined Aggregation Function)
聚集函数,多进一出
类似于:count/max/min
(3)UDTF(User-Defined Table-Generating Functions)
一进多出
如lateral view explore()
4)官方文档地址
https://cwiki.apache.org/confluence/display/Hive/HivePlugins
5)编程步骤:
(1)继承org.apache.hadoop.hive.ql. exec.UDF
(2)需要实现evaluate函数;evaluate函数支持重载;
6)注意事项
(1)UDF必须要有返回类型,可以返回null,但是返回类型不能为void;
(2)UDF中常用Text/LongWritable等类型,不推荐使用java类型;
5.3、UDF开发实例
简单UDF示例
第一步:创建maven java 工程,导入jar包
第二步:开发java类继承UDF,并重载evaluate 方法
第三步:将我们的项目打包,并上传到hive的lib目录下
第四步:添加我们的jar包
add jar /export/servers/hive-1.1.0-cdh5.14.0/lib/udf.jar;
第五步:设置函数与我们的自定义函数关联
create temporary function touppercase as 'cn.itcast.udf.ItcastUDF';
第六步:使用自定义函数
select touppercase('abc');
Json数据解析UDF开发(作业)
作业:
有原始json数据如下:
|
{"movie":"1193","rate":"5","timeStamp":"978300760","uid":"1"} {"movie":"661","rate":"3","timeStamp":"978302109","uid":"1"} {"movie":"914","rate":"3","timeStamp":"978301968","uid":"1"} {"movie":"3408","rate":"4","timeStamp":"978300275","uid":"1"} {"movie":"2355","rate":"5","timeStamp":"978824291","uid":"1"} {"movie":"1197","rate":"3","timeStamp":"978302268","uid":"1"} {"movie":"1287","rate":"5","timeStamp":"978302039","uid":"1"} |
需要将数据导入到hive数据仓库中
我不管你中间用几个表,最终我要得到一个结果表:
|
movie |
rate |
timestamp |
uid |
|
1197 |
3 |
978302268 |
1 |
注:全在hive中完成,可以用自定义函数
第一步:自定义udf函数,将我们json数据给解析出来,解析成四个字段,整成一个\t分割的一行
第二步:注册我们的自定义函数
第三步:创建一个临时表,加载json格式的数据,加载到临时表里面的一个字段里面去
第四步:insert overwrite local directory 将临时表当中的数据通过我们的自定义函数,给查询出来,放到本地路径下面去
第五步:通过load data的方式,将我们得数据加载到新表当中去
答:
1. 在linux系统的路径/export/servers/moviedatas下,新建movie.csv,将原始的json数据保存到该文件下,作为原始数据。
2. 将原始数据载入到临时表movie1中:
load data local inpath '/export/servers/moviedatas/movie.csv' overwrite into table movie1;
3. 将转换后的数据存到本地目录transferedData中:
insert overwrite local directory '/export/servers/moviedatas/transferedData' row format delimited fields terminated by '\t' select transferJson(sourceData) from movie1;
4. 将转换后的数据插入到结果表movie表中:
load data local inpath '/export/servers/moviedatas/transferedData/000000_0' into table movie;
代码:
TransferJsonUDF :
package cn.itcast.hive.udf; import org.apache.hadoop.hive.ql.exec.UDF;
import org.apache.hadoop.io.Text; public class TransferJsonUDF extends UDF {
/*
原始数据格式:{"movie":"1193","rate":"5","timeStamp":"978300760","uid":"1"}
{"movie":"661","rate":"3","timeStamp":"978302109","uid":"1"}
注意:各个系统的换行标志:
win 用 \r\n
linux/unix 用 \n
Mac OS 用 \r
*/ public Text evaluate(final Text s){
if(s == null)
return null; String str = s.toString().replace("\"","").replace("{","").replace("}",""); String[] split = str.split("[\r\n]");
StringBuffer sb = new StringBuffer();
for(String tmp:split){
String[] split2 = tmp.split(",");
for(int i=0; i < split2.length; i++){
//split2[i]的格式 movie:1193
if(i==split2.length-1){
sb.append(split2[i].split(":")[1]).append("\n");
}else{
sb.append(split2[i].split(":")[1]).append("\t");
}
}
}
return new Text(sb.toString().substring(0,sb.toString().length()-1));
} // public static void main(String[] args) {
// Text text = evaluate(new Text("{\"movie\":\"1193\",\"rate\":\"5\",\"timeStamp\":\"978300760\",\"uid\":\"1\"}\n" +
// "{\"movie\":\"661\",\"rate\":\"3\",\"timeStamp\":\"978302109\",\"uid\":\"1\"}"));
//// Text text = evaluate(new Text("{\"movie\":\"1193\",\"rate\":\"5\",\"timeStamp\":\"978300760\",\"uid\":\"1\"}"));
//// Text text = evaluate(new Text(args[0]));
// System.out.println(text.toString());
// }
}
第3节 hive高级用法:13、hive的函数的更多相关文章
- 第3节 hive高级用法:16、17、18
第3节 hive高级用法:16.hive当中常用的几种数据存储格式对比:17.存储方式与压缩格式相结合:18.总结 hive当中的数据存储格式: 行式存储:textFile sequenceFile ...
- 第3节 hive高级用法:15、hive的数据存储格式介绍
hive当中的数据存储格式: 行式存储:textFile sequenceFile 都是行式存储 列式存储:orc parquet 可以使我们的数据压缩的更小,压缩的更快 数据查询的时候尽量不要用se ...
- 第3节 hive高级用法:14、hive的数据压缩
六.hive的数据压缩 在实际工作当中,hive当中处理的数据,一般都需要经过压缩,前期我们在学习hadoop的时候,已经配置过hadoop的压缩,我们这里的hive也是一样的可以使用压缩来节省我们的 ...
- LinqToXml高级用法介绍
LinqToXml高级用法介绍 一.函数构造 什么是函数构造?其是指通过单个语句构建XML树的能力. 那么它有什么作用呢? 作用1.用单个表达式快速创建复杂的XML树 见实例代码CreateXml( ...
- 大数据技术之_08_Hive学习_04_压缩和存储(Hive高级)+ 企业级调优(Hive优化)
第8章 压缩和存储(Hive高级)8.1 Hadoop源码编译支持Snappy压缩8.1.1 资源准备8.1.2 jar包安装8.1.3 编译源码8.2 Hadoop压缩配置8.2.1 MR支持的压缩 ...
- Spark入门到精通--(第九节)环境搭建(Hive搭建)
上一节搭建完了Hadoop集群,这一节我们来搭建Hive集群,主要是后面的Spark SQL要用到Hive的环境. Hive下载安装 下载Hive 0.13的软件包,可以在百度网盘进行下载.链接: h ...
- Hive(六)内置函数与高级操作
一内置函数 1 数学函数 Return Type Name (Signature) Description DOUBLE round(DOUBLE a) Returns the rounded BIG ...
- 2.13 Hive中自带Function使用及自定义UDF编程
UDF:User Definition Function 一.function #查看自带的函数 hive (db_hive)> show functions; #查看一个函数的详细用法 hiv ...
- Hive的用法
1.Hive是Hadoop的一个子项目 利用MapReduce编程技术,实现了部分SQL语句.而且还提供SQL的编程接口.Hive推进Hadoop在数据仓库方面的发展. Hive是一个基于Hadoop ...
随机推荐
- bzoj 1127 KUP —— 最大子矩形+答案构造
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1127 首先,把权值 > 2*k 的点作为“坏点”,然后在图中用悬线法找权值最大的子矩形 ...
- bzoj4326
二分+树剖+差分 之前的做法naive,莫名其妙的wa,明明uoj95分 看到最小最大上二分,树上路径问题直接剖,然后问题就转化成了一个判定问题,每次二分出最长路径长度,问能不能达到.那么我们就把所有 ...
- facebook chat api 使用
官方API文档: https://developers.facebook.com/docs/chat/ 下面是根据文档修改的类: <?php class Invite_Chat{ protect ...
- HTML标签防XSS攻击过滤模块--待优化
HTML标签防XSS攻击过滤模块 http://cnodejs.org/topic/5058962f8ea56b5e7806b2a3
- 关于使用kafka时对于大数据消息体是遇到的问题
kafka对于消息体的大小默认为单条最大值是1M. 但是在我们应用场景中, 常常会出现一条消息大于1M, 如果不对kafka进行配置. 则会出现生产者无法将消息推送到kafka或消费者无法去消费kaf ...
- vs2008添加消息函数方法
开发MFC时,开发工具VS2008不能像开发工具VC++6.0那样,直接在类文件上右击选择“Add Window Message Handles”来添加消息映射.对于我这个初学者,刚开始一直没找到可以 ...
- spoj 1693 COCONUTS - Coconuts【最小割】
s向所有信仰1的人连(s,i,1),所有信仰0的人连(i,t,1),对于朋友关系,连接双向边,流量为1.跑最大流的结果即为答案. 考虑这样做的意义.最小割就是把总点集分割为两个点集S,T,使得所有\( ...
- 51nod 1120 机器人走方格 V3 【卡特兰数+卢卡斯定理+组合数】
-我并不知道为什么事卡特兰数,反正用dp打的表就是卡特兰数,因为是两个三角所以再乘个2 卡特兰数使用\( h(n)=\frac{C_{2n}^{n}}{n+1} \)因为范围比较大所以组合数部分用卢卡 ...
- codeforces 880E. Maximum Subsequence(折半搜索+双指针)
E. Maximum Subsequence time limit per test 1 second memory limit per test 256 megabytes input standa ...
- Survival on the Titanic (泰坦尼克号生存预测)
>> Score 最近用随机森林玩了 Kaggle 的泰坦尼克号项目,顺便记录一下. Kaggle - Titanic: Machine Learning from Disaster On ...