使用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中的數據文件都會被刪除。
