文章目录
前言
Hive作为数据仓库,用来存放企业的海量数据,Hive提供了丰富的数据类型,如关系型数据库,且提供了关系型数据库不支持的数据类型。
一、Hive基本数据类型
数据类型长度例子TINYINT1byte有符号整数30SMALLINT2byte 有符号整数30INT4byte 有符号整数30BIGIN8byte有符号整数30BOOLEAN布尔类型true 或者 falsetrueFLOAT单精度浮点数3.14159DOUBLE双精度浮点数3.14159STRING字符序列,可以指定字符集可以使用单引号或双引号“have a good day”TIMESTAMP整数、浮点数或者字符串1550738998125(Unix 新纪元秒)BINARY字节数组属于集合类型
二、Hive集合数据类型
数据类型描述字面语法事例STRUCT与C语言中的结构体struct类型相似,都可以通过"点"符号访问元素内容。例如,某表中某个列的数据类型为STRUCT(firNameSTRING, lastName STRING),那么第一个元素可通过字段名.firName 来引用STRUCT(“zhao”, “si”)MAPMAP是一个键值对映射集合。例如,表中某个列的数据类型是MAP,存放数据的格式是键→值,通过键就可以获取值,“Salary” → “8000”MAP(“Salary”, “10000”, “food”, “100”)ARRAYARRAY数组是一组具有相同类型变量的集合,这些变量被称为数组的元素,每个元素都有一个下标编号,编号从0开始,例如数组[“Salary”,“Late”]ARRAY(“Salary”, “food”)
三、Hive数据定义与操作
1.创建数据库
create database stutest;
为避免报错,可以使用以下语句:
create database if not exists stutest;
创建同时增加描述:
create database stutest comment 'for test';
2.查看数据库
show databases;
匹配数据库名
show databases like 's.*';
查看数据库描述(输出描述信息包括Hive为数据库stutest在HDFS分布式文件系统上创建的目录):
describe database stutest;
3.删除数据库
drop database;
为避免报错,可以使用以下语句:
drop database if exists stutest;
如果数据库里包含一张或多张表,需要把表
全删除
,才能删除数据库。也可以直接在命令后加上关键字cascade,将自行先删除表,再删除数据库。
drop database if exists sogou cascade;
4.创建表
create table school.student(id bigint,name string,score double,age int) row format delimited fields terminated by ',';
row delimited fields
定义行格式化分隔,
terminated by
','表示每一列之间的分隔符为都好(也可以定义其他如‘\t’)。
同时也可以加入更多后缀如下;
create table school.student(id bigint,name string,score double,age int) row format delimited fields terminated by ',' location '/user/hive/warehouse/stutest.db/school';
其中
/user/hive/warehouse/
是默认数据仓库路径地址,
stutest.db
是数据库目录,
school
是表目录,
/user/hive/warehouse/stutest.db
就是在HDFS文件系统上的数据库目录。
(1)管理表
导入数据代码如下:
load data local inpath '/home/oliver/data/student.txt' into table student;
查看数据库中的数据表内容:
show tables in stustudent;
也可以直接使用Hadoop命令查看数据表信息:
hadoop fs -ls hdfs://localhost:9000/user/hive/warehouse/stutest.db
路径的最后就是表名,删除表后,路径也会被删除。
2.外部表
在创建表时,如果加上关键字external,则创建为外部表。外部表中的数据生命周期不受Hive的控制,且可以和其他外部表进行数据的共享。Hive 创建外部表的语法如下所示,我们创建一张产品表。
create external table uuser(user_name string, user_id bigint) row format delimited fields terminated by '\t' location '/data/test';//ex-ternal关键字定义创建的表为外部表,location '/data/test'定义外部表test存放数据的HDFS 路径地址。
Hive数据库中uuser表被删除之后,表uuser在HDFS上存放数据的目录上的
/data/test/uuser.txt
文件不会被删除,在实际开发过程中,外部表external是主要的应用类型。
5.修改表
重命名表:
alter table stutest rename to stu;
增加表字段:
alter table stu add columns(sex string,height float);
6.删除表
drop table stu;
删除表的过程中,只是删除表的元信息,对于外部表只会删除表元信息,表目录信息不会被删除。对于管理表则表元信息与表目录数据信息一同删除。
7.分区表
解决数据量过大产生的数据库性能问题,主要有创建分表和创建分区表两种方式。
创建分表
是将一张大表数据分配到多张小表中,提高数据并法量,但一张表结构发生变化,则其他表都会发生变化,需要较高的sql代码维护成本。
创建分区表
,是所有数据还在同一张数据表中,但底层物理存储数据根据一定的规则,划分到不同文件中(文件还可存储到不同的磁盘上)。使用表分区技术水平分散压力,将数据从物理上移动到距离使用最频繁的用户更近的地方,缺点是表的并法量没有提高。
Hive的分区就是创建层级目录的一种方式。
(1)静态分区
创建静态分区表
stu
并且该表只有一个分区,分区列
grade
:
create table stu(id int,name string) partitioned by(grade string) row format delimited fields terminated by ',';
导入数据:
1,赵
2,钱
3,孙
load data local inpath '/home/oliver/data/stu_1.txt' into table stu partition(grade='first');
导入效果
查看表stu在HDFS上的目录结构:
查看所在数据库的目录:
根据所在数据库目录查看表在HDFS上的目录结构:
hadoop fs -lsr /user/hive/warehouse/stutest.db;
根据目录可知,在Hive数据仓库默认路径上会创建表明目录的同时,还创建一个分区名子目录,最后在分区名下存放那个世纪数据XX.txt。
继续导入:
可以看到,又新增了
~/grade=second
目录
(2)动态分区
动态分区区别与静态分区的表现为不用指定分区目录,由系统自己选择。
开启动态分区:
set hive.exec.dynamic.partition=true;
将所有分区列设置为动态:
set hive.exec.dynamic.partition.mode=nonstrict;//默认是strict
设置最大分区个数:
set hive.exec.max.dynamic.partitions.pernode=1000;//最大分区个数
检验:
创建分区表
create table student(id int) partitioned by(name string,grade string) row format delimited fields terminated by ',';
将数据导入空表(insert overwrite)
insert overwrite table student partition(name,grade) select id,name,grade from stu;
四、数据的导入导出
1.数据导入
除了使用HiveQL语句向表中传入数据外,可以通过HDFS命令行接口直接将xxx.txt数据导入Hive表,原理是将数据文件放到LOCATION属性所指向路径:
hadoop fs -put xxx.txt /stutest/stu
2.数据导出
将数据从Hive仓库导出至本地,就是从HDFS导出数据(通过HDFS命令行接口),操作如下
hadoop fs get /user/hive/warehouse/stutest.db/stu/xxx //将表stu数据导出
版权归原作者 奥利文儿 所有, 如有侵权,请联系我们删除。