文章目录

  • 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;

doris 使用hive 外部表 hive外部表overwrite_hive

2.2 查看数据库

show databases;

doris 使用hive 外部表 hive外部表overwrite_hive_02


可以看到这里有两个数据库一个是我新创建的lhd数据库,另一个是hive默认的数据库default,也就是说我们之前所创建的表位于default数据库中。

2.3 使用数据库

和SQL语言一样:

use lhd;

doris 使用hive 外部表 hive外部表overwrite_外部表_03

2. 内部表

内部表中的数据文件的全部操作都由Hive来完成,也就是说除了Hive外不会再有其他的应用使用该数据文件。现在回想我们前面几篇文章所创建的表,就可以知道全部都是内部表。内部表在创建后不仅默认会在“/user/hive/warehouse/+数据库名”,(如果使用的是默认的数据库则不带有数据库名)下生成目录,还会在目录下生成一份表的数据文件,并且在表删除后,该目录和数据文件也会删除,不信一会等着瞧。

2.1 查看表目录

dfs -ls /user/hive/warehouse/;

doris 使用hive 外部表 hive外部表overwrite_hive_04


可以看到,第一条是我刚刚创建的数据库,位于/user/hive/warehouse目录下,而person是没有带.db后缀的,是我在前几篇文章中一直操作的数据表,它是在default默认的数据库下的。

下面然我们分别看下这两个东西:

dfs -ls /user/hive/warehouse/lhd.db;

doris 使用hive 外部表 hive外部表overwrite_数据库_05


空空如也。。另一个:

dfs -ls /user/hive/warehouse/person;

doris 使用hive 外部表 hive外部表overwrite_外部表_06

再细看一下:

dfs -ls /user/hive/warehouse/person/dt=20190920;

doris 使用hive 外部表 hive外部表overwrite_外部表_07

它来了,它来了:

dfs -cat /user/hive/warehouse/person/dt=20190920/person.txt;

doris 使用hive 外部表 hive外部表overwrite_hive_08

2.2 删除表再查看

好了,,该看的都看了,下面我们删了它:

drop table person;

doris 使用hive 外部表 hive外部表overwrite_外部表_09


然后再查看一下默认数据库:

dfs -ls /user/hive/warehouse/default.db;

doris 使用hive 外部表 hive外部表overwrite_hive_10


它驾着祥云滚蛋了~

3. 外部表

3.1 外部表简介

在实际应用过程中,数据文件往往并不是只有Hive操作,其他应用或计算也会操作该文件,这种情况下往往不允许改变数据的格式和所在的位置。面对这种情况,一般会选择创建外部表来实现Hive操作。外部表也会在“/user/hive/warehouse+数据库名”下生成表的目录,但是目录内不会生成数据文件,而且在最后要抛弃它的时候,并不会删除源文件。

3.2 两种创建方式

  1. 创建一张空表,然后向表中导入数据:
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文件夹下:

doris 使用hive 外部表 hive外部表overwrite_hive_11

进入hive,使用新建立的数据库,然后第二种方式建表:

报错:

FAILED: ParseException line 13:0 missing EOF at 'stored' near ''hdfs://master001:9000/input/''

doris 使用hive 外部表 hive外部表overwrite_数据库_12

之前我把location语句放在stored前面了,现在把它放在最后面,OK:

doris 使用hive 外部表 hive外部表overwrite_数据库_13

3.4 查看表目录

心态崩了!没找到,,因为我写到master002上去了,等明天再盘它吧,今天有事先到这里了。。