022 Hive的udf入门 Hive的udf使用 Hive的文件存储格式 Hive的serde记录格式

Hive的udf入门

022 Hive的udf入门 Hive的udf使用 Hive的文件存储格式 Hive的serde记录格式_第1张图片

022 Hive的udf入门 Hive的udf使用 Hive的文件存储格式 Hive的serde记录格式_第2张图片

1.写这个代码时 需要继承UDF 但Maven里没有
022 Hive的udf入门 Hive的udf使用 Hive的文件存储格式 Hive的serde记录格式_第3张图片
2.所以需要再pom.xml配置文件配置如下信息


			org.apache.hive
			hive-exec
			1.2.1
		

3.但是加入后会出现头文件报错
就是这一行报错 现在没有错了
在这里插入图片描述
找了好久没找到错误 因为没找到提示信息
最后还是pom.xml这个文件
点击了下面的Dependencies
就在蓝色的Dependencies后面出现错误提示信息(现在没有了) 具体提示信息参考下面网址 就是没有jar包
022 Hive的udf入门 Hive的udf使用 Hive的文件存储格式 Hive的serde记录格式_第4张图片**

https://blog.csdn.net/Young_____Hu/article/details/86290227
https://blog.csdn.net/CSDN19970806/article/details/81986007
https://mvnrepository.com/artifact/org.pentaho/pentaho-aggdesigner-algorithm/5.1.5-jhyde下载地址
具体参考这两个

还要一个我加上jar包后 还是报错 不知道怎么刷新


    eigenbase
    eigenbase-properties
    1.1.5

根据解决办法加了这个之后头文件不报错了
这个配置dependency又报错 然后我就删了 竟然好了

最后是这样的
022 Hive的udf入门 Hive的udf使用 Hive的文件存储格式 Hive的serde记录格式_第5张图片


package qf.com.udf;

import org.apache.hadoop.hive.ql.exec.UDF;

/*
*@author Shishuai E-mail:[email protected]
*@version Create time : 2019年6月7日下午11:18:53
*类说明:online -> online_class
*将字符串动态拼接上一个 “_class”
*/
public class MyconcatUdf extends UDF{
	
	public String evaluate(String word) {
		if(word == null) {
			return "NULL";
		}
		return word + "_class";
	}
	
	public static void main(String[] args) {
		System.out.println(new MyconcatUdf().evaluate("online"));
	}
}

这样写好后
022 Hive的udf入门 Hive的udf使用 Hive的文件存储格式 Hive的serde记录格式_第6张图片
1.
add jar /home/wc.jar;
022 Hive的udf入门 Hive的udf使用 Hive的文件存储格式 Hive的serde记录格式_第7张图片

create temporary function myconcat as ‘qf.com.udf.MyconcatUdf’;
022 Hive的udf入门 Hive的udf使用 Hive的文件存储格式 Hive的serde记录格式_第8张图片

show functions;

022 Hive的udf入门 Hive的udf使用 Hive的文件存储格式 Hive的serde记录格式_第9张图片

desc function myconcat;
022 Hive的udf入门 Hive的udf使用 Hive的文件存储格式 Hive的serde记录格式_第10张图片

测试使用

022 Hive的udf入门 Hive的udf使用 Hive的文件存储格式 Hive的serde记录格式_第11张图片
select myconcat(s.sclass) from rn s;

022 Hive的udf入门 Hive的udf使用 Hive的文件存储格式 Hive的serde记录格式_第12张图片

注意这样的方法只是当前session有效
quit后再进入hive就无效了

4.drop function if exists myconcat;(出现问题了· 没解决)

下面我们使用另一种方式部署udf

022 Hive的udf入门 Hive的udf使用 Hive的文件存储格式 Hive的serde记录格式_第13张图片

package qf.com.udf;

import org.apache.hadoop.hive.ql.exec.UDF;
import org.json.JSONException;
import org.json.JSONObject;

/*
*@author Shishuai E-mail:[email protected]
*@version Create time : 2019年6月8日下午1:50:07
*类说明:
*/
public class KeyToValue extends UDF {
	
	public String evaluate(String av, String key) throws JSONException {
		if(av == null|| key == null) {
			return "NULL";
		}
		
		//正常取值
		//sex=1&weight=128&height=180&sla=30000
//		使用json来解析字符串
//		首先要将其转换为json格式再解析
		av = av.replaceAll("&", ",");
		av = av.replaceAll("=", ":");
		av = "{" + av + "}";
		//System.out.println(av);
		
		//将符合json格式的av转换成joson对象
		JSONObject jo = new JSONObject(av);
		return jo.get(key).toString();		
	}
	public static void main(String[] args) throws JSONException {
		System.out.println(new KeyToValue().evaluate("sex=1&weight=128&height=180&sla=30000", "sla"));
	}
}

这个配置文件的是另一种方式了 就是下面截图的配置 配置好了就是hive加载时会将auxlib文件夹一起加载 就不用add了
这里就不演示了 因为视频也没弄
022 Hive的udf入门 Hive的udf使用 Hive的文件存储格式 Hive的serde记录格式_第14张图片

cd /usr/local/hive-1.2.1

vi ./bin/.hiverc
022 Hive的udf入门 Hive的udf使用 Hive的文件存储格式 Hive的serde记录格式_第15张图片
add jar /home/wc.jar;
create temporary function ktv as ‘qf.com.udf.KeyToValue’;
022 Hive的udf入门 Hive的udf使用 Hive的文件存储格式 Hive的serde记录格式_第16张图片

然后我们需要重新进入hive才能生效
show functions;

022 Hive的udf入门 Hive的udf使用 Hive的文件存储格式 Hive的serde记录格式_第17张图片
select ktv(“sex=1&weight=128&height=180&sla=30000”, “sex”);

022 Hive的udf入门 Hive的udf使用 Hive的文件存储格式 Hive的serde记录格式_第18张图片
没有问题

如果输入的key字符串没有 就会抛异常
022 Hive的udf入门 Hive的udf使用 Hive的文件存储格式 Hive的serde记录格式_第19张图片


Hive的文件存储格式

022 Hive的udf入门 Hive的udf使用 Hive的文件存储格式 Hive的serde记录格式_第20张图片
在这里插入图片描述
022 Hive的udf入门 Hive的udf使用 Hive的文件存储格式 Hive的serde记录格式_第21张图片

022 Hive的udf入门 Hive的udf使用 Hive的文件存储格式 Hive的serde记录格式_第22张图片
hive 存储
一.textfile可以配合压缩使用

create table if not exists tf(
name String,
score String
)
row format delimited fields terminated by '\t'
stored as textfile
;

load data local inpath ‘/home/olddata/tf’ into table tf;
022 Hive的udf入门 Hive的udf使用 Hive的文件存储格式 Hive的serde记录格式_第23张图片

二、sequencefile:

create table if not exists sf(
name String,
score String
)
row format delimited fields terminated by '\t'
stored as sequencefile
;

加载数据 不能使用load方式加载
load data local inpath ‘/home/olddata/tf’ into table sf;这种报错 格式不对

使用这个方法:
insert into table sf
select name, score from tf;
022 Hive的udf入门 Hive的udf使用 Hive的文件存储格式 Hive的serde记录格式_第24张图片
022 Hive的udf入门 Hive的udf使用 Hive的文件存储格式 Hive的serde记录格式_第25张图片
看大小 压缩算法是占用一定空间的.022 Hive的udf入门 Hive的udf使用 Hive的文件存储格式 Hive的serde记录格式_第26张图片
看时间 查询的话 比普通的textfile是要快的
022 Hive的udf入门 Hive的udf使用 Hive的文件存储格式 Hive的serde记录格式_第27张图片

三、rcfile行列混合存储

create table if not exists rf(
name String,
score String
)
row format delimited fields terminated by '\t'
stored as rcfile
;

加载数据 不能使用load方式加载
load data local inpath ‘/home/olddata/tf’ into table rf;这种报错 格式不对
使用这个方法:
insert into table rf
select name, score from tf;

存储格式 show create table rf;
set hive.exec.compress.output=true;这是默认的
还可以自己改 不演示了
set mapred.output.compression.code=org.apache.hadoop.io.compress.GZipCodec;
022 Hive的udf入门 Hive的udf使用 Hive的文件存储格式 Hive的serde记录格式_第28张图片
四、orc:优化的行列混合存储

create table if not exists orf(
name String,
score String
)
row format delimited fields terminated by '\t'
stored as orc
;

insert into table orf
select name, score from tf;
022 Hive的udf入门 Hive的udf使用 Hive的文件存储格式 Hive的serde记录格式_第29张图片
022 Hive的udf入门 Hive的udf使用 Hive的文件存储格式 Hive的serde记录格式_第30张图片

四个的大小
022 Hive的udf入门 Hive的udf使用 Hive的文件存储格式 Hive的serde记录格式_第31张图片
看查询时间
022 Hive的udf入门 Hive的udf使用 Hive的文件存储格式 Hive的serde记录格式_第32张图片

这样看不严谨
应该多跑几次找平均值

022 Hive的udf入门 Hive的udf使用 Hive的文件存储格式 Hive的serde记录格式_第33张图片
022 Hive的udf入门 Hive的udf使用 Hive的文件存储格式 Hive的serde记录格式_第34张图片
022 Hive的udf入门 Hive的udf使用 Hive的文件存储格式 Hive的serde记录格式_第35张图片
022 Hive的udf入门 Hive的udf使用 Hive的文件存储格式 Hive的serde记录格式_第36张图片
还有一个
parqut格式 自己到官网看一下
还有一个hive自带的 。自定义格式
也可以到官网看一下


truncate table orf;
小方法 清空表内数据

在这里插入图片描述


Hive的serde记录格式

serde 序列化和反序列化
022 Hive的udf入门 Hive的udf使用 Hive的文件存储格式 Hive的serde记录格式_第37张图片
创建记录为csv格式的表

create table if not exists csv1(
name String,
score String
)
row format serde 'org.apache.hadoop.hive.serde2.OpenCSVSerde'
stored as textfile
;

load data local inpath '/home/olddata/csv1.csv' into table csv1;

除了OpenCSVSerde属性
还有其他属性 具体参考那个源码去看看
022 Hive的udf入门 Hive的udf使用 Hive的文件存储格式 Hive的serde记录格式_第38张图片
022 Hive的udf入门 Hive的udf使用 Hive的文件存储格式 Hive的serde记录格式_第39张图片
022 Hive的udf入门 Hive的udf使用 Hive的文件存储格式 Hive的serde记录格式_第40张图片
022 Hive的udf入门 Hive的udf使用 Hive的文件存储格式 Hive的serde记录格式_第41张图片

create table if not exists csv2(
name String,
score String
)
row format serde 'org.apache.hadoop.hive.serde2.OpenCSVSerde'
with serdeproperties(
"separatorChar"=",",
"quoteChar"="'",
"esacpeChar"="\\"
)
stored as textfile
;

load data local inpath '/home/olddata/csv1.csv' into table csv2;

022 Hive的udf入门 Hive的udf使用 Hive的文件存储格式 Hive的serde记录格式_第42张图片


json serde

使用json serde
需要下载 并 添加第三方jar包

http://www.congiu.net/hive-json-serde/
下载地址

022 Hive的udf入门 Hive的udf使用 Hive的文件存储格式 Hive的serde记录格式_第43张图片
然后就可以创建了
022 Hive的udf入门 Hive的udf使用 Hive的文件存储格式 Hive的serde记录格式_第44张图片
022 Hive的udf入门 Hive的udf使用 Hive的文件存储格式 Hive的serde记录格式_第45张图片

select j.name, j.qq, j.wechat, size(j.score)
from json1 j
where j.score[0]["lyd"][0] > 80;

022 Hive的udf入门 Hive的udf使用 Hive的文件存储格式 Hive的serde记录格式_第46张图片

json serde:

将第三方的jar包添加到hive中:
add jar /home/json-serde-1.3-jar-with-dependencies.jar;

{"name":"lyd","qq":"775600040","wechat":"15901108226","score":[{"lyd":[66,28,62],"old":[99,78,88]}]}

{"name":"laidon","qq":"775600040","wechat":"15901108226","score":[{"lyd":[89,87,88],"old":[39,58,88]}]}



create table if not exists json1(
name String,
qq String,
wechat String,
score array>>
)
row format serde 'org.openx.data.jsonserde.JsonSerDe'
stored as textfile
;


load data local inpath '/home/olddata/json1' into table json1;


select j.name, j.qq, j.wechat, size(j.score)
from json1 j
where j.score[0]["lyd"][0] > 80;

regex serde

regex serde:
数据:
220.181.108.151 [31/Jan/2012:00:02:32 +0800]
220.81.108.151 [31/Jan/2012:00:02:32 +0800]
220.c1.108.151 [31/Jan/2012:00:02:32 +0800]

create table if not exists regex1(
host String,
dt String
)
row format serde 'org.apache.hadoop.hive.serde2.RegexSerDe'
with serderproperties(
	"input.regex" = "^([0-9]{1,3}.[0-9]{1,3}.[0-9]{2,3}.[0-9]{1,3}) (.*)$"
)
stored as textfile
;	
	
load data local inpath '/home/olddata/regex1' into table regex1;	

不知道怎么回事
一下复制上 会出来这么一句
所以我就分隔一半一半复制
所以就好了
或者直接敲上
022 Hive的udf入门 Hive的udf使用 Hive的文件存储格式 Hive的serde记录格式_第47张图片
022 Hive的udf入门 Hive的udf使用 Hive的文件存储格式 Hive的serde记录格式_第48张图片
三行数据 只有两行符合正则表达式
022 Hive的udf入门 Hive的udf使用 Hive的文件存储格式 Hive的serde记录格式_第49张图片

你可能感兴趣的:(大数据)