Hive SQL查詢引數優化
阿新 • • 發佈:2020-12-09
【引數一】 hive.fetch.task.conversion 決定sql查詢是否以叢集模式執行
查詢sql :
select trans_params,trans_result from ods.tablename where trans_code=‘CF000078’ limit 10
耗時很長,期間沒有走叢集,檢視日誌查詢會fetch HDFS每日資料分割槽
檢視該引數值為more:
檢視執行計劃:
explain select trans_params,trans_result from ods.tablename where
trans_code= 'CF000078' limit 10;
可見只有一個stage,即Fetch Operator,只進行HDFS對應目錄下資料的抓取。
hive中可以通過引數控制查詢是否走叢集:
hive.fetch.task.conversion=more
時,全域性查詢,欄位查詢,filter查詢(如id>1),limit查詢等都不走叢集,直接fetch,建議在資料量小時使用fetch。
當hive.fetch.task.conversion=none
時,關閉fetch task優化,所有查詢都會以叢集模式執行。
【引數二】 hive.compute.query.using.stats 統計sql查詢結果是否從統計資訊中獲取
當hive.compute.query.using.stats=false
時,select count(*) from直接從元資料儲存的統計資訊中獲取表中記錄條數;
ANALYZE TABLE wktest.test_decimal COMPUTE STATISTICS;
如上圖所示,numRows=4,即該表元資料統計資訊中已記錄條數為4。
當hive.compute.query.using.stats=true
時,該sql查詢會以叢集模式執行返回結果。
說明:當向表中以hadoop fs -put的方式上傳資料檔案時,直接從元資料無法獲取到最新的表記錄條數。