執行count(1)或count(*)統計行數時,默認會從Hive的元數據庫中查詢 rowsNum 對應值作為結果返回。但是如果是使用加載數據文件load data的方式填充表數據,則hive元數據不會收集此統計信息,那么count時就會為0。
也就是說通過insert的方式寫入數據的表會更新hive元數據的rowsNum信息;通過load、put等方式寫入數據的表不會更新hive的元數據rowsNum信息。 Hive收集的統計信息與收集時機見官方文檔。
解決辦法:
1、使用analyze命令手動更新表統計信息,如:
analyze table ods_crm_user compute statistics;
2、對於類似於count(1)的基礎查詢不使用元數據中的統計信息,而是執行Job,即設置參數值為false
set hive.compute.query.using.stats=false;