存储饿数据是json数据;
14.解析json数据
需求:有如下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”}
需要做各种统计分析。
发现,直接对json做sql查询不方便,需要将json数据解析成普通的结构化数据表。可以采用hive中内置的json_tuple()函数
实现步骤:
1、创建一个原始表用来对应原始的json数据
create table t_tmp(json string);
数据加载:
load data local inpath ‘/root/json.txt’ into table t_tmp;
2、利用json_tuple进行json数据解析
测试,示例:
{“movie”:“1193”,“rate”:“5”,“timeStamp”:“978300760”,“uid”:“1”}
json解析后的查询结果:
select json_tuple(json,“movie”,“rate”,“timeStamp”,“uid”)
as(movie,rate,times,uid) from t_tmp;
创建Json的正式表:
create table t_json as
select json_tuple(json,“movie”,“rate”,“timeStamp”,“uid”)
as(movie,rate,times,uid) from t_tmp;
hive会自动转换类型:
如果你要强制转换 cast进行转换;
select cast(movie as string) from t_json;
分析函数(分组求数据的函数)
类似的例子:
求出一个表中按照性别划分的最大的两个人;
1,18,a,male 5
2,19,b,male 4
5,30,e,male 2
7,32,g,male 1
9,30,j,male 3
10,46,k,female 1
3,22,c,female 4
4,16,d,female 5
6,26,f,female 3
8,36,h,female 2
使用分组函数的方式:( 但是这个方法是不可能的)
select id,age,name,sex from user group by sex order by age desc limit 2;
id age name sex row_number()over(partition by sex order by age desc)
1,18,a,male 5
2,19,b,male 4
5,30,e,male 2
7,32,g,male 1
9,30,j,male 3
10,46,k,female 1
3,22,c,female 4
4,16,d,female 5
6,26,f,female 3
8,36,h,female 2
开始创建表:
create table t_TOPN(id int,age int,name string,sex String)
row format delimited fields terminated by ‘,’;
load data local inpath ‘/root/t_TOPN’ into table t_TOPN;
需要查询出每种性别中年龄最大的2条数据
select * from
(select id,age,name,sex,
row_number()over(partition by sex order by age desc) flag
from t_TOPN)a
where a.flag<=2;