关于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)





相关文章
|
4月前
|
JavaScript 前端开发
JavaScript Array map() 方法
JavaScript Array map() 方法
|
5月前
|
存储 SQL 分布式计算
Hive 中有多少种数据类型?
【8月更文挑战第12天】
465 4
|
7月前
|
存储 分布式计算 DataWorks
MaxCompute产品使用合集之要存储用户的下单所有产品,然后查询时要进行产品分组的,一般这种字段要使用ARRAY还是MAP
MaxCompute作为一款全面的大数据处理平台,广泛应用于各类大数据分析、数据挖掘、BI及机器学习场景。掌握其核心功能、熟练操作流程、遵循最佳实践,可以帮助用户高效、安全地管理和利用海量数据。以下是一个关于MaxCompute产品使用的合集,涵盖了其核心功能、应用场景、操作流程以及最佳实践等内容。
|
8月前
|
SQL 存储 Java
Hive 特殊的数据类型 Array、Map、Struct
在Hive中,`Array`、`Map`和`Struct`是三种特殊的数据类型。`Array`用于存储相同类型的列表,如`select array(1, &quot;1&quot;, 2, 3, 4, 5)`会产生一个整数数组。`Map`是键值对集合,键值类型需一致,如`select map(1, 2, 3, &quot;4&quot;)`会产生一个整数到整数的映射。`Struct`表示结构体,有固定数量和类型的字段,如`select struct(1, 2, 3, 4)`创建一个无名结构体。这些类型支持嵌套使用,允许更复杂的结构数据存储。例如,可以创建一个包含用户结构体的数组来存储多用户信息
740 0
|
8月前
|
JavaScript
js Array map映射对象多个属性
js Array map映射对象多个属性
55 0
|
8月前
|
SQL 数据采集 数据挖掘
大数据行业应用之Hive数据分析航班线路相关的各项指标
大数据行业应用之Hive数据分析航班线路相关的各项指标
216 1
|
8月前
|
SQL 存储 大数据
【大数据技术Hadoop+Spark】Hive基础SQL语法DDL、DML、DQL讲解及演示(附SQL语句)
【大数据技术Hadoop+Spark】Hive基础SQL语法DDL、DML、DQL讲解及演示(附SQL语句)
287 0
|
8月前
|
SQL 分布式计算 数据库
【大数据技术Spark】Spark SQL操作Dataframe、读写MySQL、Hive数据库实战(附源码)
【大数据技术Spark】Spark SQL操作Dataframe、读写MySQL、Hive数据库实战(附源码)
330 0
|
3月前
|
SQL 分布式计算 Java
大数据-96 Spark 集群 SparkSQL Scala编写SQL操作SparkSQL的数据源:JSON、CSV、JDBC、Hive
大数据-96 Spark 集群 SparkSQL Scala编写SQL操作SparkSQL的数据源:JSON、CSV、JDBC、Hive
78 0
|
6月前
|
SQL 分布式计算 大数据
大数据处理平台Hive详解
【7月更文挑战第15天】Hive作为基于Hadoop的数据仓库工具,在大数据处理和分析领域发挥着重要作用。通过提供类SQL的查询语言,Hive降低了数据处理的门槛,使得具有SQL背景的开发者可以轻松地处理大规模数据。然而,Hive也存在查询延迟高、表达能力有限等缺点,需要在实际应用中根据具体场景和需求进行选择和优化。