一、内部表和外部表区别

一般情况下不指定关键字External关键字创建的表都为内部表,数据默认存放在/user/hive/warehouse目录下

外部表创建是需要指定External关键字,可以手动指定存放目录,有Location关键字指定,数据可以存放到Hdfs任意目录下。

二、下面创建一个外部表t_org,存放的数据形式如下

orgid orgname orgytpe

G0001 xiaoshou 01

G0002 shichang 02

G0003 HR 03

G0004 dianshang 04

G0005 guanli 05

现在针对这种数据存储形式创建一个外部表

hive> create external table t_org

   > (orgid string,orgname string,orgtype string)

   > row format delimited

   > fields terminated by '\t'

   > location '/user/t_org';

OK

Time taken: 2.805 seconds

检查内部表默认数据存放目录是否存在t_org表

2018-08-28期 Hive的内部表和外部表_第1张图片

通过检查,创建的外部表t_org并没有在/user/hive/warehouse目录下创建表存储目录

下面检查/user/t_org在hdfs文件系统是否存在

2018-08-28期 Hive的内部表和外部表_第2张图片

通过检查创建的外部表确实在我们创建表指定的目录下创建了目录。

三、构造t_org表数据

[root@hadoop-server01 data]# cat t_org.data.1

G0001   xiaoshou        01

G0002   shichang        02

G0003   HR              03

G0004   dianshang       04

G0005   guanli          05

[root@hadoop-server01 data]#

利用hive load命令将数据加载到hdfs集群的/usr/t_org目录下

2018-08-28期 Hive的内部表和外部表_第3张图片

特别注意:load 命令是一个剪切操作,相当于将inpath路径下的文件剪切到Hive /user/warehouse目录。

hive> load data local inpath '/root/data/t_org.data.1' into table t_org;

Copying data from file:/root/data/t_org.data.1

Copying file: file:/root/data/t_org.data.1

Loading data to table default.t_org

Table default.t_org stats: [num_partitions: 0, num_files: 1, num_rows: 0, total_size: 85, raw_data_size: 0]

OK

Time taken: 0.402 seconds

通过检查数据确实加载到创建的/usr/t_org目录下

四、做连表查询

hive> select u.userid,u.username,o.orgid,o.orgname,o.orgtype,u.logintimes

   > from t_user u join t_org o

   > on u.orgid = o.orgid;

Total MapReduce CPU Time Spent: 510 msec

OK

U0001   Zhangsan        G0001   xiaoshou        01      10

U0002   Lisi            G0001   xiaoshou        01      12

U0003   Wangwu          G0002   Shichang        02      13

U0004   Liuneng         G0002   Shichang        02      18

U0005   Zhaosi          G0004   Dianshang       04      29

U0004   Liuneng         G0002   Shichang        02      18

U0005   Zhaosi1         G0004   Dianshang       04      29

U0006   Zhaosi2         G0004   Dianshang       04      29

U0009   Zhaosi5         G0004   Dianshang       04      29

U00010  Zhaosi6         G0004   Dianshang       04      29

U00011  Zhaosi7         G0002   Shichang        02      29

U00012  Zhaosi8         G0004   Dianshang       04      29

U00012  zhangsan        G0004   Dianshang       04      29

U00012  Zhangq          G0004   Dianshang       04      29

U00012  Lilin           G0004   Dianshang       04      29

U00012  Zhaoqi          G0004   Dianshang       04      29

查询hive sql语句被翻译成了MapReduce程序提交给Hadoop执行,执行结果为关联两个表查询,通过orgid进行关联,去掉了那些没有员工记录及没有部门记录的行。

五、删除内部表和外部表测试

1、删除内部表

hive> drop table t_user;

OK

Time taken: 0.702 seconds

hive>

hive> show tables;

OK

Time taken: 0.027 seconds

检查内部表默认存放目录中数据是否还存在,通过检查发现,删除内部表后会连同默认存放目录下的数据也删掉。

2018-08-28期 Hive的内部表和外部表_第4张图片

2、删除外部表

hive> drop table t_org;

OK

Time taken: 0.107 seconds

hive>

检查HDFS数据存放目录下数据是否存在,通过检查删掉外部表后,只是将外部表在元数据库中存放的建表等相关信息删除,HDFS上数据并没有一并被删除。

2018-08-28期 Hive的内部表和外部表_第5张图片