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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM