当前位置:   article > 正文

Hive的内部表与外部表(七)_hive eof at 'stored' near

hive eof at 'stored' near

1. 前言

与传统的关系型数据库不同,Hive创建的表分为内部表和外部表,对于内部表来说,在创建的时候会把数据移动到数据仓库所指向的位置;如果是外部表,则仅仅记录的是数据所存在的位置。
同时,在删除内部表的时候会把元数据和数据一起删除掉,而在删除外部表的时候只会删除元数据而不会删除原始数据。所以,如果是使用的共享数据,可以建立的是外部表;如果仅仅是Hive内部使用的数据,则可以使用内部表。接下来分别对内部表和外部表进行分析。

2. 准备工作

2.1 创建数据库

create database lhd;
  • 1

在这里插入图片描述

2.2 查看数据库

show databases;
  • 1

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

2.3 使用数据库

和SQL语言一样:

use lhd;
  • 1

在这里插入图片描述

2. 内部表

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

2.1 查看表目录

dfs -ls /user/hive/warehouse/;
  • 1

在这里插入图片描述
可以看到,第一条是我刚刚创建的数据库,位于/user/hive/warehouse目录下,而person是没有带.db后缀的,是我在前几篇文章中一直操作的数据表,它是在default默认的数据库下的。
下面然我们分别看下这两个东西:

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

在这里插入图片描述
空空如也。。另一个:

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

在这里插入图片描述再细看一下:

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

在这里插入图片描述它来了,它来了:

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

在这里插入图片描述

2.2 删除表再查看

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

drop table person;
  • 1

在这里插入图片描述
然后再查看一下默认数据库:

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

在这里插入图片描述
它驾着祥云滚蛋了~

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;
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

在上述建表语句中,通过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/';
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13

3.3 以第二种方式为例建表

先跟我操作:
在hdfs下创建input文件夹,并上传person.txt文件到input文件夹下:
在这里插入图片描述进入hive,使用新建立的数据库,然后第二种方式建表:
报错:

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

  • 1
  • 2

在这里插入图片描述之前我把location语句放在stored前面了,现在把它放在最后面,OK:
在这里插入图片描述

3.4 查看表目录

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/78881
推荐阅读
相关标签
  

闽ICP备14008679号