Hive的一些复杂操作

一、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"}

1、求出每个人评分最高的3部电影

2、求出被评分次数最多的3部电影

用hive求解过程

step1:上传文件到hdfs

在sftp窗口直接拖动文件到/home/hadoop/soft

step2:创建一张表rate_json:字段jsonline,加载json文件数据

create external table  if not exists rate_json(jsonline string) ;

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

step3:创建一张表rate:movieId int,rate int,timeStamp bigint,uid int

create external table  if not exists rate(movieId int,rate int,ts bigint,uid int) row format delimited fields terminated by '\t';

报错:FAILED: ParseException line 1:63 Failed to recognize predicate 'timeStamp'. Failed rule: 'identifier' in column specification

原因:timeStamp为关键字

step4:解析json对象属性为对应表字段,注$后字段对应json对象属性字段

insert into table rate select get_json_object(jsonline,'$.movie') as movie,get_json_object(jsonline,'$.rate') as rate,get_json_object(jsonline,'$.timeStamp') as ts,get_json_object(jsonline,'$.uid') as uid from rate_json;

step5:查询5条 

select * from Rate limit 5;

表rate中数据

二、清洗数据三种方式

1、创建表的时候使用<正则正反序列化>替换特殊分隔符为单字节分隔符

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

with serdeproperties('input.regex'='(.*)::(.*)::(.*)','output.format.string'='%1$s %2$s %3$s');

2、写shell脚本replace.sh利用文本处理命令替换双字节分隔符为单字节分隔符

/home/hadoop/hive/shell/replace.sh

#!/bin/bash

sed -i "s/::/:/g" `grep :: -rl /home/hadoop/hive/ratings.dat`

sed -i "s/::/:/g" `grep :: -rl /home/hadoop/hive/movies.dat`

sed -i "s/::/:/g" `grep :: -rl /home/hadoop/hive/users.dat`

3、自定义InputFormat组件

项目:InputFormat_UDF

类名:

cn.serenity.format.MyInputFormat

cn.serenity.format.BiRecordReader

//这里是我们修改的地方:

//加载数据的时候(也就是使用load data [local] inpath)会将所有出现||字符的替换为|

//因此创建表的时候我们制定的是第二个参数'|'

String str = value.toString().replaceAll("\\|\\|", "\\|");

value.set(str);

使用:项目导出为inputformat.jar

上传至/home/hadoop/soft/

转移到/home/hadoop/apps/apache-hive-bin-1.2.1/lib目录下

重启hive

在创建movie表时指定

stored as inputformat 'cn.serenity.format.MyInputFormat' outputformat

'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat';

三、用户自定义函数GenericUDTF

案例:影评练习 

(8)该影评库中各种类型电影中评价最高的5部电影(类型,电影名,平均影评分)

1、使用UDTF

注意代码中接收到的属性为:

fieldNames.add("movieid");

fieldNames.add("movietitle");

fieldNames.add("movietype");

String[] fields = string.split(":");

表中字段和分隔符必须与代码中的字段名和分隔符名一致

create table if not exists small_movie(movieid int,movietitle string,movietype string) row format delimited fields terminated by ':';

load data local inpath '/home/hadoop/hive/small_movie' into table small_movie;

数据样式    1::Toy Story (1995)::Animation|Children's|Comedy

该需求需要我们将电影类型拆分成n行,就上面这条记录来说,需要拆分成3行

step1:上传movies.dat文件以及jar包到到/home/hadoop/soft,

mv /home/hadoop/soft/movies.dat /home/hadoop/hive/

mv /home/hadoop/soft/InputFormat_UDF.jar /home/hadoop/udf/

并且在hive窗口下使用命令将jar包添加到class path下

hive> add jar /home/hadoop/udf/InputFormat_UDF.jar;

结果:

Added [/home/hadoop/udf/InputFormat_UDF.jar] to class path

Added resources: [/home/hadoop/udf/InputFormat_UDF.jar]

step2:调用hive/replace.sh清洗数据

sh /home/hadoop/hive/replace.sh

step3:hive窗口下创建表,注意分隔字段要个清洗数据时指定的替换字符一致

create table if not exists movie(movieid int,movietitle string,movietype string) row format delimited fields terminated by ':';

step4:加载文件movies.dat数据到表movie中

load data local inpath '/home/hadoop/hive/movies.dat' into table movie;

step5:创建临时函数关联该jar

create temporary function movie_type_split as 'cn.serenity.udtf.MovieTypeUDTF';

step5:使用

2、使用lateral view explode

create table if not exists small_movie(movieId int,moviename string,movietype string) row format delimited fields terminated by ':';

load data local inpath '/home/hadoop/hive/small_movie' into table small_movie;

SELECT  movieId,moviename,movie2.type FROM small_movie  a LATERAL VIEW explode(split(a.movietype, '\\|')) movie2 AS type;

四、复杂类型的json解析

+-------------------------------------------------------------------+

                                       json

+-------------------------------------------------------------------+

{"store":

{"fruit":[{"weight":8,"type":"apple"},{"weight":9,"type":"pear"}],

"bicycle":{"price":19.95,"color":"red"}

},

"email":"amy@only_for_json_udf_test.net",

"owner":"amy"

}

+-------------------------------------------------------------------+

json内容可以用以下查询语句解析

hive> SELECT get_json_object(src_json.json, '$.owner') FROM src_json;

amy

hive> SELECT get_json_object(src_json.json, '$.store.fruit[0]') FROM src_json;

{"weight":8,"type":"apple"}

hive> SELECT get_json_object(src_json.json, '$.non_exist_key') FROM src_json;

NULL

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,324评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,303评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,192评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,555评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,569评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,566评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,927评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,583评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,827评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,590评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,669评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,365评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,941评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,928评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,159评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,880评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,399评论 2 342

推荐阅读更多精彩内容