大数据学习之路26-hive的基本建表语句,内外部表的区别,删除表导入数据

1.建库

hive中有一个默认的库:

库名:default

库目录:hdfs://marshal:9000/user/hive/warehouse

新建库:

create database db_order;

我们的数据库在DBS中可以看到:

大数据学习之路26-hive的基本建表语句,内外部表的区别,删除表导入数据_第1张图片

库建好后,在hdfs中会生成一个库目录,目录名为库名.db

大数据学习之路26-hive的基本建表语句,内外部表的区别,删除表导入数据_第2张图片

2.基本建表语句

use db_order;

create table t_order(id string,create_time string,amount float,uid string);

表建好后,会在所属的库目录中生成一个表目录:

大数据学习之路26-hive的基本建表语句,内外部表的区别,删除表导入数据_第3张图片

但是刚才的建表语句其实是不完整的,我们如果放数据进去就会出问题。只是这样建表的话,hive会认为表数据文件中的字段分隔符为:^A。

如果我们以逗号为分割符的话,就会出现这样的状况。

hdfs dfs -put order.data.1 /user/hive/warehouse/db_order.db/t_order

大数据学习之路26-hive的基本建表语句,内外部表的区别,删除表导入数据_第4张图片

正确的建表语句为:

create table t_order(id string,create_time string,amount float,uid string)

row format delimited   //这里为固定格式,意思是要开始指定分隔符了

fields terminated by ',';  //这样就指定了表数据文件中的字段分隔符为逗号。

我们先把原来的表删除:

删除表的效果是:hive会从元数据库中清楚关于这个表的信息,hive还会从hdfs中删除这个表的表目录。

再次上传文件:

hdfs dfs -put order.data.1  /user/hive/warehouse/db_order.db/t_order/

进行查询:

大数据学习之路26-hive的基本建表语句,内外部表的区别,删除表导入数据_第5张图片

内部表导入:

方式一:手动用hdfs命令,将文件放入表目录,即前面我们的做法。

方式二:在hive的交互式shell中,用hive命令导入数据到表目录。

load data local inpath  '/root/order.data.2' into table t_order;

//这里如果文件在本地目录的话就要加上local但是如果这个文件已经在hdfs目录中了,就不用加local

这样我们再去查询的话就会有8条数据:

大数据学习之路26-hive的基本建表语句,内外部表的区别,删除表导入数据_第6张图片

我们前面使用的表都是内部表,我们可以在数据库中查看一下表的描述:

大数据学习之路26-hive的基本建表语句,内外部表的区别,删除表导入数据_第7张图片

那么MANAGED_TABLE是什么意思呢?意思就是表的目录是按照hive的规则放在固定的地方。

那么我们可不可以将表目录放在hdfs任何路径下呢?可以的。但是这样的表就成了外部表。

所以

内部表:表目录按照hive的规范来部署,位于hive的仓库目录/user/hive/warehouse中

外部表:表目录由建表用户自己指定。

create external table t_access(ip string,url string,access_time string)

row format delimited

fields terminated by ','

location '/access/log';

建立外部表的含义有很多,比如我们可以和日志采集系统的目录关联起来,这样就会有源源不断的新数据进来供我们分析。

我们再来看看表的描述,这时候就不一样了:

大数据学习之路26-hive的基本建表语句,内外部表的区别,删除表导入数据_第8张图片

查询结果:

大数据学习之路26-hive的基本建表语句,内外部表的区别,删除表导入数据_第9张图片

外部表和内部表的特性区别:

1.内部表的目录在hive仓库目录中,外部表的目录有用户指定。

2.删除一个内部表时:hive会清除相关元数据,并删除表目录

3.删除一个外部表时:hive只会清除相关元数据

所以外部表对于数据来说是比较安全的。

你可能感兴趣的:(大数据)