关于Hive中的复杂数据类型Array,Map,Structs的一些使用案例
来源:互联网 发布:长沙理工网络教学平台 编辑:程序博客网 时间:2024/05/16 12:16
转:http://blog.csdn.net/gamer_gyt/article/details/52169441
版权声明:<—— 本文为作者呕心沥血打造,若要转载,请注明出处@http://blog.csdn.net/gamer_gyt <——
目录(?)[+]
- 写在前边的话
- 1Array
- 1创建表
- 2查看array的元素
- 3内嵌查询及统计
- 4如何保存查询结果
- 2Map
- 1创建表
- 2普通查看表数据
- 3使用explode关键字查询
- 4使用explode和lateral view结合查询
- 3Structs
- 1创建数据表
- 2查询表数据
- 4collect_set函数
写在前边的话:
同样是在做豆瓣电影数据分析的小课题的时候遇到的一个问题:Hive表中的电影类型存储格式为array,那么我如何针对每一个类型做统计呢?
本来是想在基于豆瓣电影数据进行相关的数据分析项目 中进行相关解释说明的,仔细想了下,刚好拿出来,对hive的三个复杂数据类型做一个总结性的学习
关于Hive的一些其他数据类型使用参考:Hive的数据类型解析和表的操作实例
1:Array
顾名思义就是数组,使用方式 array<>
1):创建表
拿电影数据为例,数据的维度包括
创建movie_message表:
- 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 '/';
- load data local inpath "/home/master/mycode/new_movies_load.csv" into table movie_message;
2):查看array的元素
用下标进行寻找,类似于其他编程语言中的数组访问
- hive> select leixing[0] from movie_message limit 5;
- OK
- 剧情
- 剧情
- 剧情
- 纪录片
- 喜剧
- Time taken: 1.116 seconds, Fetched: 5 row(s)
3):内嵌查询及统计
这里就是 写在前边的话中提到的问题,这里使用explode和lateral view关键字,应该这样写
- select lx,count(*) from movie_message lateral view explode(leixing) leixing as lx group by lx;
- 传记 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方法,只需在你的语句前加上即可
- insert overwrite local directory "you path"
- row format delimited fields terminated by "\t"
- 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上映
- A ABC:2016-05,EFG:2016-09
- B OPQ:2015-06,XYZ:2016-04
1):创建表
- 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 ":";
- load data local inpath "/home/master/map" into table people_movie;
2):普通查看表数据
- 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关键字查询
- 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结合查询
- 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分
- ABC 1254:7.4
- DEF 256:4.9
- XYZ 456:5.4
1):创建数据表
- 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):查询表数据
- 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类型字段,假设数据格式如下:
- 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)
- select id,collect_set(name) from test group by id;
- 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)
- 关于Hive中的复杂数据类型Array,Map,Structs的一些使用案例
- 关于Hive中的复杂数据类型Array,Map,Structs的一些使用案例
- Hive数据类型之Structs、Array、Map的使用
- HIVE中map,array和structs使用
- HIVE中map,array和structs使用
- HIVE中map,array和structs使用
- HIVE中map,array和structs使用
- HIVE的数据类型hive array、map、struct使用
- hive复杂格式array,map,struct使用
- Hive的复杂数据类型之Array
- Hive复合数据类型array,map,struct的使用
- Hive复合数据类型array,map,struct的使用
- 第92课,Hive中的Array,Map,Struct及自定义数据类型案例实战。
- hive复合数据类型 array、map、struct使用
- Hive中的复杂数据类型
- 大数据Spark “蘑菇云”行动第92课:HIVE中的array、map、struct及自定义数据类型案例实战
- hive中复杂数据类型的使用
- Hive的复杂数据类型
- github项目链接
- 171.Anagrams-乱序字符串(中等题)
- github上关于iOS的各种开源项目集合
- nginx启动,重启,关闭命令
- KoaHub.JS基于Node.js开发的处理和显示日期代码
- 关于Hive中的复杂数据类型Array,Map,Structs的一些使用案例
- oracle11g rac RMAN备份恢复至单机
- android开发步步为营之113:Gradle错误Unsupported major.minor version 52.0和 finished with non-zero exit value1解决
- 赵三——简单的执着
- Angular 2 版本的 ng-bootstrap 初体验
- 了解git的工作区和暂存区
- 【Java每日一题】20161025
- 各个JSON技术的比较(Jackson,Gson,Fastjson)的对比
- 第九周项目二--对称矩阵压缩存储的实现与应用(2)