内部表和外部表
一、内部表的概念
先在hive里建一张表,然后向这个表插入数据(用insert可以插入数据,也可以通过加载外部文件方式来插入数据),这样的表称之为hive的内部表
二、外部表的概念
- HDFS里已经有数据了,然后,通过hive创建一张表来管理这个文件数据。则这样表称之为外部表
- 注意,hive外部表管理的是HDFS里的某一个目录下的文件数据
三、外部表创建命令:
进入hive,执行:create external table stu (id int,name string) row format delimited fields terminated by ’ ’ location ‘/目录路径’
四、内部表和外部标的区别
- 对于内部表,在删除该表的时候,HDFS对应的目录节点会被删除
- 对于外部表,在删除该表的时候,HDFS对应的目录节点不会删除
基础命令详解
命令 | 作用 | 额外说明 |
---|---|---|
show databases; | 查看都有哪些数据库 | |
create database park; | 创建park数据库 | 创建的数据库,实际是在Hadoop的HDFS文件系统里创建一个目录节点,统一存在: /user/hive/warehouse 目录下 |
use park; | 进入park数据库 | |
show tables; | 查看当前数据库下所有表 | |
create table stu (id int,name string); | 创建stu表,以及相关的两个字段 | 1. hive里,表示字符串用的是string,不用char和varchar 2. 所创建的表,也是HDFS里的一个目录节点 |
insert into stu values(1,‘zhang’) | 向stu表插入数据 | 1. HDFS不支持数据的修改和删除,因此已经插入的数据不能够再进行任何的改动 2. 在Hadoop2.0版本后支持了数据追加。实际上,insert into 语句执行的是追加操作 3. hive支持查询,行级别的插入。不支持行级别的删除和修改 4. hive的操作实际是执行一个job任务,调用的是Hadoop的MR 5. 插入完数据之后,发现HDFS stu目录节点下多了一个文件,文件里存了插入的数据,因此,hive存储的数据,是通过HDFS的文件来存储的。 |
select * from stu | 查看表数据 | 也可以根据字段来查询,比如select id from stu |
drop table stu | 删除表 | |
load data local inpath ‘/home/software/1.txt’ into table stu; | 通过加载文件数据到指定的表里 | 1. 在执行完这个指令之后,发现hdfs stu目录下多了一个1.txt文件。由此可见,hive的工作原理实际上就是在管理hdfs上的文件,把文件里数据抽象成二维表结构,然后提供hql语句供程序员查询文件数据 2. 可以做这样的实验:不通过load 指令,而通过插件向stu目录下再上传一个文件,看下hive是否能将数据管理到stu表里。 |
create table stu1(id int,name string) row format delimited fields terminated by ’ '; | 创建stu1表,并指定分割符 空格。 | |
desc stu | 查看 stu表结构 | |
create table stu2 like stu | 创建一张stu2表,表结构和stu表结构相同 | like只复制表结构,不复制数据 |
insert overwrite table stu2 select * from stu | 把stu表数据插入到stu2表中 | |
insert overwrite local directory ‘/home/stu’ row format delimited fields terminated by ’ ’ select * from stu; | 将stu表中查询的数据写到本地的/home/stu目录下 | |
insert overwrite directory ‘/stu’ row format delimited fields terminated by ’ ’ select * from stu; | 将stu表中查询的数据写到HDFS的stu目录下 | |
from stu insert overwrite table stu1 select * insert overwrite table stu2 select *; | 将stu表中查询的数据写到stu1以及stu2两张表中 | |
alter table stu rename to stu2 | 为表stu重命名为stu2 | |
alter table stu add columns (age int); | 为表stu增加一个列字段age,类型为int | |
exit | 退出hive |
分区表指令
一、分区表概述
- 分区表可以通过添加指定的字段来提高Hive的查询效率
- 在数据量较大的情况下,往往会添加分区表来避免全表查询
二、分区表指令
指令 | 作用 | 额外说明 |
---|---|---|
create table book (id int, name string) partitioned by (category string) row format delimited fields terminated by ‘\t’; | 创建book表,以category作为分区 | 在创建分区表时,partitioned字段可以不在字段列表中。生成的表中自动就会具有该字段。 |
load data local inpath ‘/home/cn.txt’ overwrite into table book partition (category=‘cn’); | 将本地文件cn.txt添加到book表中,分区字段为cn | 在HDFS下生成category=cn目录 |
select * from book where category=‘cn’; | 查看分区为cn的数据 | |
ALTER TABLE book add PARTITION (category = ‘jp’) location ‘/user/hive/warehouse/park.db/book/category=jp’; | 将指定的目录添加为分区字段 | |
show partitions iteblog; | 查看分区 | |
msck repair table book; | 修复分区 | |
alter table book drop partition(category=‘cn’); | 删除分区 | |
alter table book partition(category=‘french’) rename to partition (category=‘hh’); | 修改分区的名字 |
分桶表指令
一、概述
- 分桶表是一种更细粒度的数据分配方式
- 一个表既可以分区也可以分桶
- 分桶的主要作用是实现数据的抽样,方便进行数据测试
- 分桶表通过hash分桶算法,将数据分放在不同的桶(hdfs中的文件)中,方便后续获取
- 分桶表机制默认是不开启的,需要手动开启:set hive.enforce.bucketing=true;
- 分桶表不允许以外部文件方式导入数据,只能从另外一张表数据导入
二、分桶表语法
指令 | 作用 | 额外说明 |
---|---|---|
create table teacher(name string) clustered by (name) into 3 buckets row format delimited fields terminated by ’ '; | 创建teacher表,以name作为分桶机制,分为3个桶 | |
insert overwrite table teacher select * from tmp; | 将tmp表中的数据添加到teacher表中 | 实际上是产生了3个文件用于存储不分桶的数据 |
select * from teacher tablesample(bucket 1 out of 3 on name); | 进行抽样 | 抽样格式为:bucket x out of y on XXX 1. x表示抽样的起始桶,例如bucket 1 out of 3表示从第1 个桶开始抽取数据 2. y决定抽样的比例,要求必须是桶数的因子或者整数倍 a. 如果桶数为6,y为2,则表示抽取6/2=3个桶中的数据 b. 如果桶数为6,y为3,则表示抽取6/3=2个桶中的数据 c. 如果桶数为6,y为12,则表示抽取6/12=0.5个桶中的数据 3. 如果桶数为6,抽样为bucket 1 out of 3 on id表示从第1个桶开始抽样,抽取2个桶的数据,所以抽取的样本为1和4桶中的数据 |
数据类型
一、基本类型
Hive中的类型 | Java中的类型 |
---|---|
tinyint | byte |
smallint | short |
int | int |
bigint | long |
boolean | boolean |
float | float |
double | double |
string | String |
timestamp | TimeStamp |
binary | byte[] |
二、复杂类型
数组类型 array
案例一
原始数据:
100,200,300
200,300,500
建表语句:
create external table ex(vals array<int>