文章目录
- 前言
- 一、Hive基本数据类型
- 二、Hive集合数据类型
- 三、Hive数据定义与操作
- 1.创建数据库
- 2.查看数据库
- 3.删除数据库
- 4.创建表
- 5.修改表
- 6.删除表
- 7.分区表
- 四、数据的导入导出
- 1.数据导入
- 2.数据导出
前言
Hive作为数据仓库,用来存放企业的海量数据,Hive提供了丰富的数据类型,如关系型数据库,且提供了关系型数据库不支持的数据类型。
一、Hive基本数据类型
数据类型 长度 例子 TINYINT 1byte有符号整数 30 SMALLINT 2byte 有符号整数 30 INT 4byte 有符号整数 30 BIGIN 8byte有符号整数 30 BOOLEAN 布尔类型true 或者 false true FLOAT 单精度浮点数 3.14159 DOUBLE 双精度浮点数 3.14159 STRING 字符序列,可以指定字符集可以使用单引号或双引号 “have a good day” TIMESTAMP 整数、浮点数或者字符串 1550738998125(Unix 新纪元秒) BINARY 字节数组 属于集合类型 二、Hive集合数据类型
数据类型 描述 字面语法事例 STRUCT 与C语言中的结构体struct类型相似,都可以通过"点"符号访问元素内容。例如,某表中某个列的数据类型为STRUCT(firNameSTRING, lastName STRING),那么第一个元素可通过字段名.firName 来引用 STRUCT(“zhao”, “si”) MAP MAP是一个键值对映射集合。例如,表中某个列的数据类型是MAP,存放数据的格式是键→值,通过键就可以获取值,“Salary” → “8000” MAP(“Salary”, “10000”, “food”, “100”) ARRAY ARRAY数组是一组具有相同类型变量的集合,这些变量被称为数组的元素,每个元素都有一个下标编号,编号从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数据导出
猜你喜欢
- 16小时前kafka服务器连接出现:[NetworkClient.java:935] [Producer clientId=producer-1] Node -1 disconnected原因分析
- 16小时前软件架构设计的核心:抽象与模型、“战略编程”
- 16小时前留学中介收费情况(留学中介机构收费标准)
- 15小时前段子特仑苏什么意思(特仑苏 段子)
- 8小时前aabc的词语有哪些大全(aabc式的词语有什么?)
- 8小时前桂林航天工业学院(桂林航天工业学院图书馆官网)
- 4小时前报关证(报关证考试报名条件)
- 3小时前芒果籽怎么种才能发芽(芒果籽怎么种才能发芽呢)
- 1小时前路考注意事项(路考注意事项和要领)
- 1小时前简单的童言趣语怎么写(童言趣语 短句)
网友评论
- 搜索
- 最新文章
- 热门文章