一、内部表和外部表区别
一般情况下不指定关键字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表
通过检查,创建的外部表t_org并没有在/user/hive/warehouse目录下创建表存储目录
下面检查/user/t_org在hdfs文件系统是否存在
通过检查创建的外部表确实在我们创建表指定的目录下创建了目录。
三、构造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目录下
特别注意: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
检查内部表默认存放目录中数据是否还存在,通过检查发现,删除内部表后会连同默认存放目录下的数据也删掉。
2、删除外部表
hive> drop table t_org;
OK
Time taken: 0.107 seconds
hive>
检查HDFS数据存放目录下数据是否存在,通过检查删掉外部表后,只是将外部表在元数据库中存放的建表等相关信息删除,HDFS上数据并没有一并被删除。