关于Hive中的复杂数据类型Array,Map,Structs的一些使用案例

转:http://blog.csdn.net/gamer_gyt/article/details/52169441


写在前边的话:

        同样是在做豆瓣电影数据分析的小课题的时候遇到的一个问题:Hive表中的电影类型存储格式为array,那么我如何针对每一个类型做统计呢?

        本来是想在基于豆瓣电影数据进行相关的数据分析项目      中进行相关解释说明的,仔细想了下,刚好拿出来,对hive的三个复杂数据类型做一个总结性的学习

        关于Hive的一些其他数据类型使用参考:Hive的数据类型解析和表的操作实例

1:Array

     顾名思义就是数组,使用方式 array<>

     1):创建表

     拿电影数据为例,数据的维度包括


      创建movie_message表:

  1. create table movie_message(  
  2.     id int,  
  3.     title string,  
  4.     daoyan array<string>,  
  5.     bianju array<string>,  
  6.     leixing array<string>,  
  7.     zhuyan array<string>,  
  8.     year int,  
  9.     month int,  
  10.     shichang int,  
  11.     disnum int,  
  12.     score float  
  13. )  
  14. comment "this table about movie's message"  
  15. row format delimited fields terminated by ","  
  16. collection items terminated by '/';  
create table movie_message(
    id int,
	title string,
	daoyan array<string>,
	bianju array<string>,
	leixing array<string>,
	zhuyan array<string>,
	year int,
	month int,
	shichang int,
	disnum int,
	score float
)
comment "this table about movie's message"
row format delimited fields terminated by ","
collection items terminated by '/';
      加载数据(可以从本地加载,也可以从hdfs装载,当然也可以从别的表中查询结果进行转载),这里从本地装载

  1. load data local inpath "/home/master/mycode/new_movies_load.csv" into table movie_message;  
load data local inpath "/home/master/mycode/new_movies_load.csv" into table movie_message;

    2):查看array的元素

      用下标进行寻找,类似于其他编程语言中的数组访问

  1. hive> select leixing[0] from movie_message limit 5;  
  2. OK  
  3. 剧情  
  4. 剧情  
  5. 剧情  
  6. 纪录片  
  7. 喜剧  
  8. Time taken: 1.116 seconds, Fetched: 5 row(s)  
hive> select leixing[0] from movie_message limit 5;
OK
剧情
剧情
剧情
纪录片
喜剧
Time taken: 1.116 seconds, Fetched: 5 row(s)

   3):内嵌查询及统计

     这里就是 写在前边的话中提到的问题,这里使用explode和lateral view关键字,应该这样写

  1. select lx,count(*) from movie_message lateral view explode(leixing) leixing as lx group by lx;  
select lx,count(*) from movie_message lateral view explode(leixing) leixing as lx group by lx;
       结果为:
  1. 传记    194  
  2. 儿童    18  
  3. 冒险    242  
  4. 剧情    1490  
  5. 动作    252  
  6. 动画    106  
  7. 历史    208  
  8. 古装    9  
  9. 同性    84  
  10. 喜剧    618  
  11. 奇幻    178  
  12. 家庭    130  
  13. 恐怖    152  
  14. 悬念    2  
  15. 悬疑    386  
  16. 情色    19  
  17. 惊悚    435  
  18. 戏曲    11  
  19. 战争    144  
  20. 歌舞    40  
  21. 武侠    1  
  22. 灾难    11  
  23. 爱情    404  
  24. 犯罪    442  
  25. 真人秀  6  
  26. 短片    165  
  27. 科幻    165  
  28. 纪录片  620  
  29. 脱口秀  10  
  30. 舞台艺术        8  
  31. 西部    6  
  32. 运动    29  
  33. 音乐    123  
  34. 鬼怪    1  
  35. 黑色电影        4  
传记    194
儿童    18
冒险    242
剧情    1490
动作    252
动画    106
历史    208
古装    9
同性    84
喜剧    618
奇幻    178
家庭    130
恐怖    152
悬念    2
悬疑    386
情色    19
惊悚    435
戏曲    11
战争    144
歌舞    40
武侠    1
灾难    11
爱情    404
犯罪    442
真人秀  6
短片    165
科幻    165
纪录片  620
脱口秀  10
舞台艺术        8
西部    6
运动    29
音乐    123
鬼怪    1
黑色电影        4

     4):如何保存查询结果

       这里使用overwrite方法,只需在你的语句前加上即可

  1. insert overwrite local directory "you path"  
insert overwrite local directory "you path"
          也可以指定字段之间的分隔符
  1. row format delimited fields terminated by "\t"  
row format delimited fields terminated by "\t"
          还是上边统计类型的例子,这里将其查询结果保存在本地/home/master/mycode/movie_leixing
  1. insert overwrite local directory "/home/master/mycode/movie_leixing"  
  2. row format delimited fields terminated by "\t"  
  3. select lx,count(*) from movie_message lateral view explode(leixing) leixing as lx group by lx;  
insert overwrite local directory "/home/master/mycode/movie_leixing"
row format delimited fields terminated by "\t"
select lx,count(*) from movie_message lateral view explode(leixing) leixing as lx group by lx;
          

2:Map

     就是<key:value>这样的键值对,假设我们有这样格式的数据人物A,主演了BCD电影,将于2016-05上映

  1. A       ABC:2016-05,EFG:2016-09  
  2. B       OPQ:2015-06,XYZ:2016-04  
A       ABC:2016-05,EFG:2016-09
B       OPQ:2015-06,XYZ:2016-04

     1):创建表

  1. create table people_movie(  
  2. name string,  
  3. movie map<string,string> )  
  4. row format delimited fields terminated by "\t"  
  5. collection items terminated by ","  
  6. map keys terminated by ":";  
 create table people_movie(
 name string,
 movie map<string,string> )
 row format delimited fields terminated by "\t"
 collection items terminated by ","
 map keys terminated by ":";
           加载数据
  1. load data local inpath "/home/master/map" into table people_movie;  
load data local inpath "/home/master/map" into table people_movie;

     2):普通查看表数据

  1. hive> select * from people_movie;  
  2. OK  
  3. A       {"ABC":"2016-05","EFG":"2016-09"}  
  4. B       {"OPQ":"2015-06","XYZ":"2016-04"}  
  5. A       {"ABC":"2016-05","EFG":"2016-09"}  
  6. B       {"OPQ":"2015-06","XYZ":"2016-04"}  
  7. Time taken: 0.148 seconds, Fetched: 4 row(s)  
  8. hive> select movie['ABC'] from people_movie;  
  9. OK  
  10. 2016-05  
  11. NULL  
  12. 2016-05  
  13. NULL  
  14. Time taken: 0.144 seconds, Fetched: 4 row(s)  
hive> select * from people_movie;
OK
A       {"ABC":"2016-05","EFG":"2016-09"}
B       {"OPQ":"2015-06","XYZ":"2016-04"}
A       {"ABC":"2016-05","EFG":"2016-09"}
B       {"OPQ":"2015-06","XYZ":"2016-04"}
Time taken: 0.148 seconds, Fetched: 4 row(s)
hive> select movie['ABC'] from people_movie;
OK
2016-05
NULL
2016-05
NULL
Time taken: 0.144 seconds, Fetched: 4 row(s)

    3):使用explode关键字查询

  1. hive> select explode(movie) as (m_name,m_time) from people_movie;  
  2. OK  
  3. ABC     2016-05  
  4. EFG     2016-09  
  5. OPQ     2015-06  
  6. XYZ     2016-04  
  7. ABC     2016-05  
  8. EFG     2016-09  
  9. OPQ     2015-06  
  10. XYZ     2016-04  
  11. Time taken: 0.121 seconds, Fetched: 8 row(s)  
hive> select explode(movie) as (m_name,m_time) from people_movie;
OK
ABC     2016-05
EFG     2016-09
OPQ     2015-06
XYZ     2016-04
ABC     2016-05
EFG     2016-09
OPQ     2015-06
XYZ     2016-04
Time taken: 0.121 seconds, Fetched: 8 row(s)

   4):使用explode和lateral view结合查询

  1. hive> select name,mo,time from people_movie lateral view explode(movie) movie as mo,time;   
  2. OK  
  3. A       ABC     2016-05  
  4. A       EFG     2016-09  
  5. B       OPQ     2015-06  
  6. B       XYZ     2016-04  
  7. A       ABC     2016-05  
  8. A       EFG     2016-09  
  9. B       OPQ     2015-06  
  10. B       XYZ     2016-04  
  11. Time taken: 0.147 seconds, Fetched: 8 row(s)  
hive> select name,mo,time from people_movie lateral view explode(movie) movie as mo,time; 
OK
A       ABC     2016-05
A       EFG     2016-09
B       OPQ     2015-06
B       XYZ     2016-04
A       ABC     2016-05
A       EFG     2016-09
B       OPQ     2015-06
B       XYZ     2016-04
Time taken: 0.147 seconds, Fetched: 8 row(s)

3:Structs

     类似于C语言中的结构体,内部数据通过X.X来获取,假设我们的数据格式是这样的,电影ABC,有1254人评价过,打分为7.4分

  1. ABC     1254:7.4  
  2. DEF     256:4.9  
  3. XYZ     456:5.4  
ABC     1254:7.4
DEF     256:4.9
XYZ     456:5.4

     1):创建数据表

  1. Time taken: 0.147 seconds, Fetched: 8 row(s)  
  2. hive> create table movie_score(  
  3.     > name string,  
  4.     > info struct<number:int,score:float>  
  5.     > )row format delimited fields terminated by "\t"  
  6.     > collection items terminated by ":";  
Time taken: 0.147 seconds, Fetched: 8 row(s)
hive> create table movie_score(
    > name string,
    > info struct<number:int,score:float>
    > )row format delimited fields terminated by "\t"
    > collection items terminated by ":";

     2):查询表数据

  1. hive> select * from movie_score;  
  2. OK  
  3. ABC     {"number":1254,"score":7.4}  
  4. DEF     {"number":256,"score":4.9}  
  5. XYZ     {"number":456,"score":5.4}  
  6. Time taken: 0.103 seconds, Fetched: 3 row(s)  
  7. hive> select info.number,info.score from movie_score;  
  8. OK  
  9. 1254    7.4  
  10. 256     4.9  
  11. 456     5.4  
  12. Time taken: 0.148 seconds, Fetched: 3 row(s)  
hive> select * from movie_score;
OK
ABC     {"number":1254,"score":7.4}
DEF     {"number":256,"score":4.9}
XYZ     {"number":456,"score":5.4}
Time taken: 0.103 seconds, Fetched: 3 row(s)
hive> select info.number,info.score from movie_score;
OK
1254    7.4
256     4.9
456     5.4
Time taken: 0.148 seconds, Fetched: 3 row(s)

4:collect_set函数

     这里再另外介绍一个函数collect_set(),该函数的作用是将某字段的值进行去重汇总,产生Array类型字段,假设数据格式如下:

  1. hive> select * from test;  
  2. OK  
  3. 1       A  
  4. 1       C  
  5. 1       B  
  6. 2       B  
  7. 2       C  
  8. 2       D  
  9. 3       B  
  10. 3       C  
  11. 3       D  
  12. Time taken: 0.096 seconds, Fetched: 6 row(s)  
hive> select * from test;
OK
1       A
1       C
1       B
2       B
2       C
2       D
3       B
3       C
3       D
Time taken: 0.096 seconds, Fetched: 6 row(s)
      现在要统计每个id得到的等级
  1. select id,collect_set(name) from test group by id;  
 select id,collect_set(name) from test group by id;
      结果为

  1. Total MapReduce CPU Time Spent: 3 seconds 360 msec  
  2. OK  
  3. 1       ["A","C","B"]  
  4. 2       ["B","C","D"]  
  5. 3       ["B","C","D"]  
  6. Time taken: 32.298 seconds, Fetched: 3 row(s)  
Total MapReduce CPU Time Spent: 3 seconds 360 msec
OK
1       ["A","C","B"]
2       ["B","C","D"]
3       ["B","C","D"]
Time taken: 32.298 seconds, Fetched: 3 row(s)



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值