【HIVE】数据的定义与操作

前言

Hive作为数据仓库,用来存放企业的海量数据,Hive提供了丰富的数据类型,如关系型数据库,且提供了关系型数据库不支持的数据类型。


一、Hive基本数据类型

数据类型长度例子
TINYINT1byte有符号整数30
SMALLINT2byte 有符号整数30
INT4byte 有符号整数30
BIGIN8byte有符号整数30
BOOLEAN布尔类型true 或者 falsetrue
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”)
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数据导出
  • 27
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值