刪除外部表時遇到的坑

cliffchou發表於2019-01-26

洗引擎資料的時候,由於改動了幾個欄位,因此需要刪除原來關聯了HDFS指定路徑的外部表,重新建外部表表並關聯HDFS。問題就出現在刪外部表上,開始使用truncate的時候,發現並不能 刪除外部表,於是查了查發現truncate只能刪除內部表,於是果斷使用一下命令將外部表先變成了內部表,然後再使用drop進行刪除

alter table xxx set tblproperties('external'='false')
drop table xxx

結果表是給刪除了,然後發現HDFS上關聯路徑下的分割槽資料也全部沒了,然後就開始了悽慘的補資料之路...

現在總結下外部表和內部表:

1.內、外部表區別與聯絡

外部表——>建立表的時候指定external,外部表在刪除之後,僅會刪除hive外部表中後設資料,不會刪除資料和指定路徑
內部表——>刪除內部表會將資料和預設路徑都刪除,因此可能會誤刪資料,謹慎操作

教訓:千萬不要為了刪除外部表就將外部表先轉化為內部表,這樣會將HDFS上的資料一併刪除的

內外部錶轉換

內部表——>外部表:alter table xxx set tblproperties('external'='false')
外部表——>內部表:alter table xxx set tblproperties('external'='true')

2.truncate和drop以及delete簡介

1)truncate:用於刪除表或者分割槽中所有的行,但表結構及其列、約束、索引等保持不變,而且不記錄單個行刪除操作

  • truncate table tablename [partition partition_spec]           省略了partition會刪除表中所有分割槽

  • truncate不能用於刪除外部表,因為外部表中只是存放著後設資料,真實資料並不在hive中

2)delete: 可以刪除特定行,也可以刪除所有行,並且在事務日誌中為所刪除的每行記錄一項

  • 不帶where字句的delete和truncate功能相同,均是刪除表中的全部行,但是truncate速度快,並且使用的系統和事務日誌資源少

  • 由foreign key約束引用的表,不能使用truncate刪除,而應該使用不帶where子句的delete進行刪除,由於truncate table不記錄在日誌中,所以它不能啟用觸發器

3)drop:刪除整個表資料及其表定義

  • drop table [if exists] tablename

3.刪除外部表——這樣可以避免誤刪關聯路徑中資料

1)刪除外部表分割槽

alter table tablename drop partition(partitions...)

2)刪除HDFS上的資料

hdfs dfs -ls url_name

reference: blog.csdn.net/tengxing007…
                 blog.csdn.net/u011686226/…

相關文章