Hive创建内部表、外部表
使用hive需要hive环境
启动Hive
进入HIVE_HOME/bin,启动hive
./hive
内部表
- 建表
hive> create table fz > (id int,name string,age int,tel string) > ROW FORMAT DELIMITED > FIELDS TERMINATED BY ',' > STORED AS TEXTFILE;
创建完成后使用 show tables; 查看是否创建成功.
hive> show tables;
OK
fz
Time taken: 0.043 seconds, Fetched: 9 row(s)
- 导入数据
提前准备好一个txt文件,文件内容如下
1,fz,25,131888888888 2,test,20,13222222222 3,dx,24,183938384983
接下来导入数据
hive> load data local inpath '/Users/FengZhen/Desktop/Hadoop/hive/testfile/fz.txt' into table fz; Loading data to table default.fz Table default.fz stats: [numFiles=1, totalSize=66] OK Time taken: 0.784 seconds
查看表中的数据。
hive> select * from fz; OK 1 fz 25 13188888888888 2 test 20 13222222222 3 dx 24 183938384983 Time taken: 0.445 seconds, Fetched: 3 row(s)
数据已经导入成功。
在导入数据的过程中,如果在建表的过程中没有指定location,那么就会在hive.metastore.warehouse.dir指定的路径下,以表名创建一个文件夹,之后所有有关该表的数据都会存储到此文件夹中。
hive.metastore.warehouse.dir是在HIVE_HOME/conf/hive-site.xml中配置的,如下,我配置的路径为/user/hive/warehouse
<property> <name>hive.metastore.warehouse.dir</name> <value>/user/hive/warehouse</value> </property>
现在去HDFS中就可以看到该路径下有个文件夹名为fz,fz下有个文件就是我们在导入数据时,从本地文件系统拷贝到HDFS中的fz.txt.
EFdeMacBook-Pro:conf FengZhen$ hadoop fs -ls /user/hive/warehouse/fz Found 1 items -rwxr-xr-x 1 FengZhen supergroup 66 2017-06-06 10:57 /user/hive/warehouse/fz/fz.txt
- 删除该表
hive> drop table fz; OK Time taken: 0.141 seconds
该表删除后,再去HDFS中看一下还有没有之前创建的文件夹。
hadoop fs -ls /user/hive/warehouse
结果显示该文件夹已经没有了,也就是说当我们在删除内部表的时候,不仅删除了表中的数据,还删除了数据文件。
外部表
- 建表
hive> create external table fz_external_table(id int,name string,age int,tel string)
> ROW FORMAT DELIMITED
> FIELDS TERMINATED BY ','
> STORED AS TEXTFILE
> location '/user/hive/external/fz_external_table';
建外部表时要加external关键字,我在建表时指定了location,当然也可以不指定,不指定就默认使用hive.metastore.warehouse.dir指定的路径。
- 导入数据
提前准备好数据文件fz_external.txt,数据同上,只是换了个名。
1,fz,25,13188888888888 2,test,20,13222222222 3,dx,24,183938384983
4,test1,22,1111111111
接下来进行导入数据的操作
hive> load data local inpath '/Users/FengZhen/Desktop/Hadoop/hive/testfile/fz_external_table.txt' into table fz_external_table;
Loading data to table default.fz_external_table
Table default.fz_external_table stats: [numFiles=0, totalSize=0]
OK
Time taken: 0.224 seconds
查看表内数据。
hive> select * from fz_external_table; OK 1 fz 25 13188888888888 2 test 20 13222222222 3 dx 24 183938384983 4 test1 22 1111111111 Time taken: 0.06 seconds, Fetched: 4 row(s)
现在数据已经导入成功,接下来去HDFS中查看以下,在location指定的路径下
EFdeMacBook-Pro:testfile FengZhen$ hadoop fs -ls /user/hive/external/fz_external_table; Found 1 items -rwxr-xr-x 1 FengZhen supergroup 88 2017-06-06 13:44 /user/hive/external/fz_external_table/fz_external_table.txt
可以看到,往外部表中导入数据的时候,本地文件系统中的数据文件也被拷贝到了HDFS中。
现在来删除外部表,看一下HDFS中文件有没有被删除。
hive> drop table fz_external_table; OK Time taken: 0.103 seconds
外部表已经删除成功,看下HDFS中
EFdeMacBook-Pro:testfile FengZhen$ hadoop fs -ls /user/hive/external/fz_external_table; Found 1 items -rwxr-xr-x 1 FengZhen supergroup 88 2017-06-06 13:44 /user/hive/external/fz_external_table/fz_external_table.txt
可以看到,HDFS中数据文件在表被删除的情况下,还是存在的,也就是说删除外部表,只能删除表数据,并不能删除数据文件。
内部表与外部表的不同
- 创建外部表需要添加 external 字段。而内部表不需要。
- 删除外部表时,HDFS中的数据文件不会一起被删除。而删除内部表时,表数据及HDFS中的数据文件都会被删除。