外部表是在已经在hdfs上有数据,为了用hive进行分析数据,在数据不改变的情况下,用hive创建一个外部表,直接指向已经存在的文件。
可以在hive下指向hadoop的shell,但是格式不同,在hive一定要有分号“;”作为结束。
外部表类型:TBLS表的TBL_TYPE为EXTERNAL_TABLE
1.创建文件夹在hdfs上
执行hadoop的命令在hive中,只要去掉原来的hadoop就可以执行。
如:
/data
2.上传数据到hdfs的data目录下面
/data/a.txt
/data/b.txt
3.创建外部表语句
create external table ext_student(id int,name string) row format delimited fields terminated by '\t' location '/data';
(1)用关键字external
(2)指定分隔符
(3)指定hdfs上的数据。
hive> dfs -put /hadoop/student.txt /data/a.txt;
hive> dfs -put /hadoop/student.txt /data/b.txt;
hive> dfs ls /data/ ;
ls: Unknown command
Did you mean -ls? This command begins with a dash.
Command failed with exit code = -1
Query returned non-zero code: -1, cause: null
hive> dfs -ls /data/;
Found 2 items
-rw-r--r-- 1 root supergroup 30 2015-05-09 17:45 /data/a.txt
-rw-r--r-- 1 root supergroup 30 2015-05-09 17:45 /data/b.txt
hive> create external table ext_student(id int,name string) row format delimited fields terminated by '\t' location '/data';
OK
Time taken: 0.89 seconds
hive> select * from ext_student;
OK
1 zhangsan
2 lisi
3 wangwu
1 zhangsan
2 lisi
3 wangwu
Time taken: 0.57 seconds, Fetched: 6 row(s)
hive>
4.在hdfs中再添加一个文件如pep.avi的文件
查询结果会多出pep.avi中的数据。
hive> dfs -put /hadoop/pep.avi /data/
> ;
hive> select * from ext_student
> ;
OK
1 zhangsan
2 lisi
3 wangwu
1 zhangsan
2 lisi
3 wangwu
5 jiangning
6 goodluck
Time taken: 1.161 seconds, Fetched: 8 row(s)
hive>
> ;
hive> select * from ext_student
> ;
OK
1 zhangsan
2 lisi
3 wangwu
1 zhangsan
2 lisi
3 wangwu
5 jiangning
6 goodluck
Time taken: 1.161 seconds, Fetched: 8 row(s)
hive>
在外部表与内部表都是这样会查询指定目录下的所有文件,
这些信息是在metestore中指定目录下面查询,只要将数据放入指定目录就会查询。