【云计算】Hive的高级操作解析
小标 2019-01-23 来源 : 阅读 1464 评论 0

摘要:本文主要向大家介绍了【云计算】Hive的高级操作解析,通过具体的内容向大家展现,希望对大家学习云计算有所帮助。

本文主要向大家介绍了【云计算】Hive的高级操作解析,通过具体的内容向大家展现,希望对大家学习云计算有所帮助。


Hive的高级操作


三、函数


2、自定义函数UDF


当 Hive 提供的内置函数无法满足业务处理需要时,此时就可以考虑使用用户自定义函数。


UDF(user-defined function)作用于单个数据行,产生一个数据行作为输出。(数学函数,字 符串函数)


UDAF(用户定义聚集函数 User- Defined Aggregation Funcation):接收多个输入数据行,并产 生一个输出数据行。(count,max)


UDTF(表格生成函数 User-Defined Table Functions):接收一行输入,输出多行(explode)


(1)简单UDF示例


A. 导入hive需要的jar包,自定义一个java类继承UDF,重载 evaluate 方法


ToLowerCase.java


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


public class ToLowerCase extends UDF{


// 必须是 public,并且 evaluate 方法可以重载


public String evaluate(String field) {


String result = field.toLowerCase();


return result;


}


}


B. 打成 jar 包上传到服务器


C. 将 jar 包添加到 hive 的 classpath


add JAR /home/hadoop/udf.jar;


D. 创建临时函数与开发好的 class 关联起来


0: jdbc:hive2://hadoop3:10000> create temporary function tolowercase as 'com.study.hive.udf.ToLowerCase';


E. 至此,便可以在 hql 在使用自定义的函数


0: jdbc:hive2://hadoop3:10000> select tolowercase('HELLO');


(2) JSON数据解析UDF开发


现有原始 json 数据(rating.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”}


{“movie”:”2804”,”rate”:”5”,”timeStamp”:”978300719”,”uid”:”1”}


{“movie”:”594”,”rate”:”4”,”timeStamp”:”978302268”,”uid”:”1”}


现在需要将数据导入到 hive 仓库中,并且最终要得到这么一个结果:


该怎么做、???(提示:可用内置 get_json_object 或者自定义函数完成)


A. get_json_object(string json_string, string path)


返回值:string


说明:解析json的字符串json_string,返回path指定的内容。如果输入的json字符串无效,那么返回NULL。这个函数每次只能返回一个数据项。


0: jdbc:hive2://hadoop3:10000> select get_json_object('{"movie":"594","rate":"4","timeStamp":"978302268","uid":"1"}','$.movie');


创建json表并将数据导入进去


0: jdbc:hive2://hadoop3:10000> create table json(data string);


No rows affected (0.983 seconds)


0: jdbc:hive2://hadoop3:10000> load data local inpath '/home/hadoop/json.txt' into table json;


No rows affected (1.046 seconds)


0: jdbc:hive2://hadoop3:10000>


0: jdbc:hive2://hadoop3:10000> select


. . . . . . . . . . . . . . .> get_json_object(data,'$.movie') as movie


. . . . . . . . . . . . . . .> from json;


B. json_tuple(jsonStr, k1, k2, …)


参数为一组键k1,k2……和JSON字符串,返回值的元组。该方法比get_json_object高效,因为可以在一次调用中输入多个键


0: jdbc:hive2://hadoop3:10000> select


. . . . . . . . . . . . . . .> b.b_movie,


. . . . . . . . . . . . . . .> b.b_rate,


. . . . . . . . . . . . . . .> b.b_timeStamp,


. . . . . . . . . . . . . . .> b.b_uid


. . . . . . . . . . . . . . .> from json a


. . . . . . . . . . . . . . .> lateral view json_tuple(a.data,'movie','rate','timeStamp','uid') b as b_movie,b_rate,b_timeStamp,b_uid;


(3) Transform实现


Hive 的 TRANSFORM 关键字提供了在 SQL 中调用自写脚本的功能。适合实现 Hive 中没有的 功能又不想写 UDF 的情况


具体以一个实例讲解。


Json 数据: {“movie”:”1193”,”rate”:”5”,”timeStamp”:”978300760”,”uid”:”1”}


需求:把 timestamp 的值转换成日期编号


1、先加载 rating.json 文件到 hive 的一个原始表 rate_json


create table rate_json(line string) row format delimited;


load data local inpath '/home/hadoop/rating.json' into table rate_json;


2、创建 rate 这张表用来存储解析 json 出来的字段:


create table rate(movie int, rate int, unixtime int, userid int) row format delimited fields


terminated by '\t';


解析 json,得到结果之后存入 rate 表:


insert into table rate select


get_json_object(line,'$.movie') as moive,


get_json_object(line,'$.rate') as rate,


get_json_object(line,'$.timeStamp') as unixtime,


get_json_object(line,'$.uid') as userid


from rate_json;


3、使用 transform+python 的方式去转换 unixtime 为 weekday


先编辑一个 python 脚本文件


########python######代码


## vi weekday_mapper.py


#!/bin/python


import sys


import datetime


for line in sys.stdin:


line = line.strip()


movie,rate,unixtime,userid = line.split('\t')


weekday = datetime.datetime.fromtimestamp(float(unixtime)).isoweekday()


print '\t'.join([movie, rate, str(weekday),userid])


保存文件 然后,将文件加入 hive 的 classpath:


hive>add file /home/hadoop/weekday_mapper.py;


hive> insert into table lastjsontable select transform(movie,rate,unixtime,userid)


using 'python weekday_mapper.py' as(movie,rate,weekday,userid) from rate;


创建最后的用来存储调用 python 脚本解析出来的数据的表:lastjsontable


create table lastjsontable(movie int, rate int, weekday int, userid int) row format delimited


fields terminated by '\t';


最后查询看数据是否正确


select distinct(weekday) from lastjsontable;


四、特殊分隔符处理


补充:hive 读取数据的机制:


1、 首先用 InputFormat<默认是:org.apache.hadoop.mapred.TextInputFormat >的一个具体实 现类读入文件数据,返回一条一条的记录(可以是行,或者是你逻辑中的“行”)


2、 然后利用 SerDe<默认:org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe>的一个具体 实现类,对上面返回的一条一条的记录进行字段切割


Hive 对文件中字段的分隔符默认情况下只支持单字节分隔符,如果数据文件中的分隔符是多 字符的,如下所示:


01||huangbo


02||xuzheng


03||wangbaoqiang


1、使用RegexSerDe正则表达式解析


创建表


create table t_bi_reg(id string,name string)


row format serde 'org.apache.hadoop.hive.serde2.RegexSerDe'


with serdeproperties('input.regex'='(.*)\\|\\|(.*)','output.format.string'='%1$s %2$s')


stored as textfile;


导入数据并查询


0: jdbc:hive2://hadoop3:10000> load data local inpath '/home/hadoop/data.txt' into table t_bi_reg;


No rows affected (0.747 seconds)


0: jdbc:hive2://hadoop3:10000> select a.* from t_bi_reg a;


2、通过自定义InputFormat处理特殊分隔符


          

本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标大数据云计算大数据安全频道!


本文由 @小标 发布于职坐标。未经许可,禁止转载。
喜欢 | 0 不喜欢 | 0
看完这篇文章有何感觉?已经有0人表态,0%的人喜欢 快给朋友分享吧~
评论(0)
后参与评论

您输入的评论内容中包含违禁敏感词

我知道了

助您圆梦职场 匹配合适岗位
验证码手机号,获得海同独家IT培训资料
选择就业方向:
人工智能物联网
大数据开发/分析
人工智能Python
Java全栈开发
WEB前端+H5

请输入正确的手机号码

请输入正确的验证码

获取验证码

您今天的短信下发次数太多了,明天再试试吧!

提交

我们会在第一时间安排职业规划师联系您!

您也可以联系我们的职业规划师咨询:

小职老师的微信号:z_zhizuobiao
小职老师的微信号:z_zhizuobiao

版权所有 职坐标-一站式AI+学习就业服务平台 沪ICP备13042190号-4
上海海同信息科技有限公司 Copyright ©2015 www.zhizuobiao.com,All Rights Reserved.
 沪公网安备 31011502005948号    

©2015 www.zhizuobiao.com All Rights Reserved