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 点击打开链接