文章目录
- 1. 前言
- 2. 准备工作
- 2.1 创建数据库
- 2.2 查看数据库
- 2.3 使用数据库
- 2. 内部表
- 2.1 查看表目录
- 2.2 删除表再查看
- 3. 外部表
- 3.1 外部表简介
- 3.2 两种创建方式
- 3.3 以第二种方式为例建表
- 3.4 查看表目录
1. 前言
与传统的关系型数据库不同,Hive创建的表分为内部表和外部表,对于内部表来说,在创建的时候会把数据移动到数据仓库所指向的位置;如果是外部表,则仅仅记录的是数据所存在的位置。
同时,在删除内部表的时候会把元数据和数据一起删除掉,而在删除外部表的时候只会删除元数据而不会删除原始数据。所以,如果是使用的共享数据,可以建立的是外部表;如果仅仅是Hive内部使用的数据,则可以使用内部表。接下来分别对内部表和外部表进行分析。
2. 准备工作
2.1 创建数据库
create database lhd;
2.2 查看数据库
show databases;
可以看到这里有两个数据库一个是我新创建的lhd数据库,另一个是hive默认的数据库default,也就是说我们之前所创建的表位于default数据库中。
2.3 使用数据库
和SQL语言一样:
use lhd;
2. 内部表
内部表中的数据文件的全部操作都由Hive来完成,也就是说除了Hive外不会再有其他的应用使用该数据文件。现在回想我们前面几篇文章所创建的表,就可以知道全部都是内部表。内部表在创建后不仅默认会在“/user/hive/warehouse/+数据库名”,(如果使用的是默认的数据库则不带有数据库名)下生成目录,还会在目录下生成一份表的数据文件,并且在表删除后,该目录和数据文件也会删除,不信一会等着瞧。
2.1 查看表目录
dfs -ls /user/hive/warehouse/;
可以看到,第一条是我刚刚创建的数据库,位于/user/hive/warehouse目录下,而person是没有带.db后缀的,是我在前几篇文章中一直操作的数据表,它是在default默认的数据库下的。
下面然我们分别看下这两个东西:
dfs -ls /user/hive/warehouse/lhd.db;
空空如也。。另一个:
dfs -ls /user/hive/warehouse/person;
再细看一下:
dfs -ls /user/hive/warehouse/person/dt=20190920;
它来了,它来了:
dfs -cat /user/hive/warehouse/person/dt=20190920/person.txt;
2.2 删除表再查看
好了,,该看的都看了,下面我们删了它:
drop table person;
然后再查看一下默认数据库:
dfs -ls /user/hive/warehouse/default.db;
它驾着祥云滚蛋了~
3. 外部表
3.1 外部表简介
在实际应用过程中,数据文件往往并不是只有Hive操作,其他应用或计算也会操作该文件,这种情况下往往不允许改变数据的格式和所在的位置。面对这种情况,一般会选择创建外部表来实现Hive操作。外部表也会在“/user/hive/warehouse+数据库名”下生成表的目录,但是目录内不会生成数据文件,而且在最后要抛弃它的时候,并不会删除源文件。
3.2 两种创建方式
- 创建一张空表,然后向表中导入数据:
create external table person(
id int,
name string,
age int,
fav array<string>,
addr map<string, string>
)
comment 'This is the person table'
row format delimited fields terminated by '\t'
collection items terminated by '-'
map keys terminated by ':'
stored as textfile;
在上述建表语句中,通过external关键字指明创建的表是外部表。
2. 在创建表的同时,指定数据文件的位置:
create external table person(
id int,
name string,
age int,
fav array<string>,
addr map<string, string>
)
comment 'This is the person table'
row format delimited fields terminated by '\t'
collection items terminated by '-'
map keys terminated by ':'
stored as textfile
location 'hdfs://master002:9000/input/';
3.3 以第二种方式为例建表
先跟我操作:
在hdfs下创建input文件夹,并上传person.txt文件到input文件夹下:
进入hive,使用新建立的数据库,然后第二种方式建表:
报错:
FAILED: ParseException line 13:0 missing EOF at 'stored' near ''hdfs://master001:9000/input/''
之前我把location语句放在stored前面了,现在把它放在最后面,OK:
3.4 查看表目录
心态崩了!没找到,,因为我写到master002上去了,等明天再盘它吧,今天有事先到这里了。。