arcengine遍历属性表_记录一次Hive表清理过程
記錄一次Hive表清理過程
背景
時間:2020-07-17在用spark+hive做數倉的過程中往往會產生很多表,過多歷史表會很快消耗掉有限的hdfs資源,并且時間過于久遠的表一般不會具有利用價值了,如果不及時清理這部分hive表會造成hdfs資源的嚴重浪費,因此需要有一個類似于HiveClean的定時任務,執行定期清理舊數據的邏輯。
動機
在接手這個功能需求的時候,已經有了一個HiveClean的版本,基本的清理邏輯如下:
- 遍歷所有需要清理的hive表
- 執行ALTER TABLE $cluster%s.$table%s SET TBLPROPERTIES('external'='false')來把hive外部表轉換成hive內部表
ps:如果直接刪除外部表,只會從hive metastore中刪除外部表的元數據,而對應的物理文件依然存放在hdfs中,沒有達成我們的目的
- 篩選出需要刪除的表分區,執行ALTER TABLE $cluster%s.$table%s DROP PARTITION (time_hour='xxx')來刪除對應的分區
現在的需求是改進這個邏輯:注意上面的最后一步,刪除分區的方式是一個一個刪除,想看看能不能用范圍刪除的方式來清理舊分區
問題
這是Spark SQL自身的局限性
上面顯示的Type MANAGED表明Hive表示內部表,如果顯示的是Type EXTERNAL則說明是外部表
,有兩個值得關注的回答:
重點在于下面的評論,先看回答中給出的方案,顯然跟我們現有的HiveClean中的一樣,說是大小寫敏感的問題,但是這是網上流傳甚廣的誤導方案,正確的設置語句應該是大寫的:ALTER TABLE $cluster%s.$table%s SET TBLPROPERTIES('EXTERNAL'='FALSE'),但是如果在spark中執行的話會報錯(hive中當然一點問題都沒有):Error in query: Cannot set or change the preserved property key: 'EXTERNAL';
現在來看答案下面的解釋,簡單來說就是EXTERNAL是保留字并且大小寫敏感,如果設置的是external那么只會給Hive表新增一條自定義屬性'external',EXTERNAL依然沒有改變(即內外部表的屬性沒變)
既然改變EXTERNAL的值才行,但Spark中又沒法執行,那怎么辦呢?總不能手工把所有的表全部設置為內部表吧,萬一將來新增了新的表忘記了設置為內部表,又或者希望將內部表轉成外部表,每次都手工設置顯得很不優雅,有什么好方法嗎?別急,也在這個SO的回答中,看下面
這個無需多說,無腦照抄就行,親測有效
Hive分區修復命令MSCK用法:MSCK REPAIR TABLE xxx,可以參考這篇文章了解一下MSCK命令:
一二三沖鴨:一起學Hive——使用MSCK命令修復Hive分區?zhuanlan.zhihu.com后續
但是現在在Spark中按范圍刪除Hive表分區的問題依然沒有解決,反倒歪打正著修復了存在已久的bug。。。
總結
以上是生活随笔為你收集整理的arcengine遍历属性表_记录一次Hive表清理过程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: js判断字符串包含某个字符_python
- 下一篇: xcode 可以打开xmind_原来xm