Hive表分區,數據就在hive分區目錄中,然後執行下面的語句。
這裏有四種映射hdfs文件和hive表的方法。
執行select count()並選擇*
文件權限rwx
Select count()結果不為0。
Select *正常顯示數據。
執行select count()並選擇*
文件權限rw
Select count()的結果為0。
Select *正常顯示數據。
執行select count()並選擇*
文件權限rwx
Select count()結果不為0。
Select *正常顯示數據。
執行select count()並選擇*
文件權限rw
Select count()結果不為0。
Select *正常顯示數據。
基於以上四種情況,在創建分區表時,有些人會直接把數據放在對應的分區文件夾下,然後alter add partition,這是壹種加載數據的方式,會執行select count(*),返回0。他們不會執行mr task,而是直接讀取表級統計中的數據,而不會執行mr。
以下是hive.compute.query.using.stats的解釋
為新創建的表和表分區(如使用INSERT OVERWRITE語句創建的表)啟用表級統計信息的自動收集。該參數不生成列級統計信息,如CBO生成的那些信息。如果禁用,管理員必須使用ANALYZE table語句為新生成的表和表分區手動生成表級統計信息。
但默認值為真時,加載load的還是執行Mr,這部分要看源代碼。我還沒有找到這個源代碼,但是我比較了兩邊的統計信息,用下面的語句來看表的統計信息。
發現用alter加載數據和用load加載數據是有區別的。
以下是《帶負荷》的截圖。
下面是使用alter加載的截圖。
得到以上結論,我們正在深入探索,如果我們將新數據加載到dept1,dept1中的統計信息是否會更新。
我再次把數據放到dept1的另壹個分區後,查詢count(*),才發現又回到mr進行計算。
然後desc擴展dept1,發現沒有column _ stats _ accurate的數據。
原來建立之初默認使用的是壹張表。
首先有數據但是count(*)返回0,這是hive造成的。compute.query.using.stats = true,但不是hive。compute.query.using.stats = true。所有表都將計數(*)=0。第壹,要分表是否是分區表。會自動有column _ stats _ accurate的數據(不管這裏hive.compute.query.using.stats是否為真),然後column _ stats _ accurate的數據在加載到特定分區時會消失,但是column _ stats _ accurate的數據在用alter加載到分區時不會消失。
當表不是普通的非分區表時,沒有column _ stats _ accurate的數據。這時候不管是用load還是alter加載數據,count(* (*)都會帶走mr,這就是為什麽dept4也用alter,但是在執行count(*)的時候帶走Mr。但是,當執行分析表命令時,也會生成統計信息,並且在執行count(* (*)時不會獲取mr。
hive.compute.query.using.stats之前版本的默認值為fasle,現在為TRUE。我不知道是哪個版本的。如果設置為true,則在執行某些查詢(如select count(1))時,Hive將僅使用保存在元數據存儲中的狀態信息來返回結果。為了收集基本的狀態信息,您需要將hive.stats.autogather屬性配置為true。為了收集更多的狀態信息,您需要運行分析表查詢命令,例如下面的語句來收集sales_order_fact表的統計信息。