Hive之数据类型和视图


Hive系列


第八章 数据类型和视图

8.1 数据类型

8.1.1 原子数据类型

在这里插入图片描述
(其实上图中有一点错误,大家可以找找看)

说明:

1、Hive 支持日期类型(老版本不支持),在 Hive 里日期一般都是用字符串来表示的,而常用的日期格式转化操作则是通过自定义函数进行操作,当然也可以直接指定为日期类型。

2、Hive 是用 Java 开发的,Hive 里的基本数据类型和 java 的基本数据类型基本上是对应的, 除了 String 类型。

3、有符号的整数类型:TINYINT、SMALLINT、INT 和 BIGINT 分别等价于 Java 的 Byte、Short、 Int 和 Long 原子类型,它们分别为 1 字节、2 字节、4 字节和 8 字节有符号整数。

4、Hive 的浮点数据类型 FLOAT 和 DOUBLE,对应于 Java 的基本类型 Float 和 Double 类型。

5、Hive 的 BOOLEAN 类型相当于 Java 的基本数据类型 Boolean。 

6、Hive 的 String 类型相当于数据库的 Varchar 类型,该类型是一个可变的字符串,不过它不 能声明其中最多能存储多少个字符,理论上它可以存储 2GB 的字符数。

8.1.2 复杂数据类型

8.1.2.1 理论

复杂数据类型包括数组(ARRAY)、映射(MAP)和结构体(STRUCT),具体如下所示

ARRAY:ARRAY 类型是由一系列相同数据类型的元素组成,这些元素可以通过下标来访问。 比如有一个 ARRAY 类型的变量 fruits,它是由['apple','orange','mango']组成,那么我们可以通过 fruits[1]来访问元素 orange,因为 ARRAY 类型的下标是从 0 开始的 。

MAP:MAP 包含 key->value 键值对,可以通过 key 来访问元素。比如”userlist”是一个 map 类 型 , 其 中 username 是 key , password 是 value ; 那 么 我 们 可 以 通 过 userlist['username']来得到这个用户对应的 password。

STRUCT:STRUCT 可以包含不同数据类型的元素。这些元素可以通过”点语法”的方式来得到所需要的元素,比如 user 是一个 STRUCT 类型,那么可以通过 user.address 得 到这个用户的地址。

示例:

CREATE TABLE student(  
	name STRING,  
	favors ARRAY<STRING>,  
	scores MAP<STRING, FLOAT>,     
	address STRUCT<province:STRING, city:STRING, detail:STRING, zip:INT> 
)     
	ROW FORMAT DELIMITED     
	FIELDS TERMINATED BY '\t'     
	COLLECTION ITEMS TERMINATED BY ';' 
	MAP KEYS TERMINATED BY ':' ; 

说明:

1、字段 name 是基本类型,favors 是数组类型,可以保存很多爱好,scores 是映射类型,可以保存多个课程的成绩,address 是结构类型,可以存储住址信息 。
2、ROW FORMAT DELIMITED 是指明后面的关键词是列和元素分隔符的 。
3、FIELDS TERMINATED BY 是字段分隔符 。
4、COLLECTION ITEMS TERMINATED BY 是元素分隔符(Array 中的各元素、Struct 中的各元素、 Map 中的 key-value 对之间) 。
5、MAP KEYS TERMINATED BY 是 Map 中 key 与 value 的分隔符 。
6、LINES TERMINATED BY 是行之间的分隔符 。
7、STORED AS TEXTFILE 指数据文件上传之后保存的格式 。

总结:在关系型数据库中,我们至少需要三张表来定义,包括学生基本表、爱好表、成绩表; 但在 Hive 中通过一张表就可以搞定了。也就是说,复合数据类型把多表关系通过一张表就 可以实现了。

8.1.2.2 实践
1、数组
create database db;
use db;
create table person(name string,location array<string>) row format delimited fields terminated by "\t" collection items terminated by ",";

vim array.txt,在里面添加如下数据
Huangbo	beijing,shanghai,tianjin,Hangzhou
Xuzheng	tianjin,chengdu,wuhan 
Wangbaoqiang	wuhan,shenyang,jilin

load data local inpath '/home/data/array.txt' into table person;

select * from person;
select location from person;
select location[0] from person;

2、map
vim map.txt
huangbo	yuwen:80,shuxue:89,yingyu:95
xuzheng	yuwen:70,shuxue:65,yingyu:81
wangbaoqiang	yuwen:75,shuxue:100,yingyu:75

接下来创建一个新的表,可以解析这个三个数据:
create table score(name string, scores map<string,int>) row format delimited fields terminated by '\t' collection items terminated by ',' map keys terminated by ':';

desc formatted score;

load data local inpath '/home/data/map.txt' into table score;

select * from score;
select name from score; 
select scores from score; 
select s.scores['yuwen'] from score s;

3、struct结构
建表语句: 
create table structtable(id int,course struct<name:string,score:int>) row format delimited fields terminated by '\t' collection items terminated by ','; 
 数据: 
vim structtable.txt
1	english,80
2	math,89
3	chinese,95
 
导入数据: 
load data local inpath '/home/data/structtable.txt' into table structtable; 
 
查询语句: 
select * from structtable;
select id from structtable;
select course from structtable;
select t.course.name from structtable t;
select t.course.score from structtable t;

8.2 Hive视图

8.2.1 理论

和关系型数据库一样,Hive 也提供了视图的功能,不过请注意,Hive 的视图和关系型数据库的视图还是有很大的区别:
1、只有逻辑视图,没有物理视图;
2、视图只能查询,不能 Load/Insert/Update/Delete 数据;
3、视图在创建时候,只是保存了一份元数据,当查询视图的时候,才开始执行视图对应的那些子查询 。

创建视图

create view view_name as select * from carss; 
create view carss_view as select * from carss limit 500; 

查看视图

show tables;   // 可以查看表,也可以查看视图 
desc view_name  // 查看某个具体视图的信息 
desc carss_view 

删除视图

drop view view_name 
drop view if exists carss_view 

使用视图

create view sogou_view as select * from sogou_table where rank > 3 ; 
select count(distinct uid) from sogou_view; 

8.2.2 实际操作

视图
use myhive;
查询下面的语句
select department, count(*) as total from student group by department;

select a.department,a.total from (select department, count(*) as total from student group by department) a;

创建一个视图:
create view groupby_dpt_count as select department, count(*) as total from student group by department;

select a.department,a.total from groupby_dpt_count a;//虚表
select department,total from groupby_dpt_count;//虚表

show views;1.x不对,2.x对,3.x对。
show tables;//对的

删除视图:
drop table groupby_dpt_count;//这是不可以的。不同版本不一样。注意测试。
2021-10-11 22:19:59,670 ERROR [5f4ee6d3-64c4-4b25-afe9-b17761db9179 main] exec.DDLTask: Failed
org.apache.hadoop.hive.ql.metadata.HiveException: Cannot drop a view with DROP TABLE
.......
注意测试,不同的版本不一样。hive3.1.2报错如上

drop view groupby_dpt_count;//可以的


声明:
        文章中代码及相关语句为自己根据相应理解编写,文章中出现的相关图片为自己实践中的截图和相关技术对应的图片,若有相关异议,请联系删除。感谢。转载请注明出处,感谢。


By luoyepiaoxue2014

微博地址: http://weibo.com/luoyepiaoxue2014 点击打开链接

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值