开发者社区> thinkgamer.cn> 正文

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

简介: 写在前边的话:         同样是在做豆瓣电影数据分析的小课题的时候遇到的一个问题:hive表中的电影类型存储格式为array,那么我如何针对每一个类型做统计呢?         本来是想在基于豆瓣电影数据进行相关的数据分析项目      中进行相关解释说明的,仔细想了下,刚好拿...
+关注继续查看

写在前边的话:

        同样是在做豆瓣电影数据分析的小课题的时候遇到的一个问题: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 '/';
      加载数据(可以从本地加载,也可以从hdfs装载,当然也可以从别的表中查询结果进行转载),这里从本地装载

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"
          还是上边统计类型的例子,这里将其查询结果保存在本地/home/master/mycode/movie_leixing
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)
      现在要统计每个id得到的等级
 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)





版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
ES6 从入门到精通 # 11:Map 数据类型
ES6 从入门到精通 # 11:Map 数据类型
10 0
Scala的map实现key和value排序及各种排序比较等知识讨论
Scala的map实现key和value排序及各种排序比较等知识讨论
50 0
Flink - The object probably contains or references non serializable fields 无法序列化问题
使用 Flink 自定义 Source 生成数据时,集群提交任务时显示 org.apache.log4j.Logger@72c927f1 is not serializable. The object probably contains or references non serializable fields.
425 0
Scala常规操作之数组、List、Tuple、Set、Map
Scala常规操作之数组、List、Tuple、Set、Map
67 0
scala中的list怎么存储对象
scala中的list是一个不可变的列表,有时候我们想直接添加对象不太方便,这个时候可以先转成java的List添加完再转回去. LIst支持在头部快速添加和移除条目,但是不提供快速按下标访问的功能,这个功能需要线性遍历列。 快速的头部添加和移除意味着模式匹配很顺畅
147 0
Hive解析Json数组超全讲解(一)
在Hive中会有很多数据是用Json格式来存储的,如开发人员对APP上的页面进行埋点时,会将多个字段存放在一个json数组中,因此数据平台调用数据时,要对埋点数据进行解析。接下来就聊聊Hive中是如何解析json数据的。
2351 0
Hive解析Json数组超全讲解(二)
在Hive中会有很多数据是用Json格式来存储的,如开发人员对APP上的页面进行埋点时,会将多个字段存放在一个json数组中,因此数据平台调用数据时,要对埋点数据进行解析。接下来就聊聊Hive中是如何解析json数据的。
546 0
Scala学习笔记:how to convert a StringRDD to Array
Scala学习笔记:how to convert a StringRDD to Array
48 0
scala 两个Map 集合合并
//参考《快学scala》 集合操作 foldLeft page:180 package alogrithnm import scala.
1453 0
+关注
thinkgamer.cn
wechat 搜索【数据与算法联盟】,专注于云计算和算法,目前就职于京东
文章
问答
文章排行榜
最热
最新
相关电子书
更多
Scaling 30 TB’s of Data Lake with Apache HBase and Scala DSL at Production
立即下载
Scaling 30 TB\'s of Data lake with Apache HBase and Scala DSL at Production
立即下载
低代码开发师(初级)实战教程
立即下载