Hive之Hive快捷查詢(避免Mapruduce查詢)

潛水到明朝發表於2016-09-26

避免Mapruduce查詢

如果你想查詢某個表的某一列,Hive預設是會啟用MapReduce Job來完成這個任務。
但是,我們可以設定引數來避免Mapruduce查詢,下面先介紹一下幾個小的知識點,並不Mapruduce查詢。

hive (zb_dwd)> select * from  user_id  limit 1;
OK
14510812944   
Time taken: 1.608 seconds, Fetched: 1 row(s)

這種情況下,Hive可以簡單地讀取user_id對應的儲存目錄下的檔案,然後輸出格式化後的內容到控制檯。
對於WHERE語句中的過濾條件只是分割槽欄位情況,也是無需MapRuduce過程。

hive (zb_dwd)> select * from  user_id  where date_id=`20140512` limit 1;
OK
14510812944 
Time taken: 0.782 seconds, Fetched: 1 row(s)

引數設定

Hive查詢的時候,啟用MapReduce Job是會消耗系統開銷的。對於這個問題,從Hive0.10.0版本開始,對於簡單的不需要聚合的類似SELECT

from

###1.
set hive.fetch.task.conversion=more;開啟了Fetch任務,所以對於上述簡單的列查詢不在啟用MapReduce job

hive> set hive.fetch.task.conversion=more;
hive> SELECT id, money FROM m limit 10;
OK
1       122
1       185
1       231
1       292
1       316
1       329
1       355
1       356
1       362
1       364
Time taken: 0.138 seconds, Fetched: 10 row(s)

2.

bin/hive設定

bin/hive --hiveconf hive.fetch.task.conversion=more

3.

上面的兩種方法都可以開啟了Fetch任務,但是都是臨時起作用的;如果你想一直啟用這個功能,可以在${HIVE_HOME}/conf/hive-site.xml裡面加入以下配置

<property>
  <name>hive.fetch.task.conversion</name>
  <value>more</value>
  <description>
    Some select queries can be converted to single FETCH task 
    minimizing latency.Currently the query should be single 
    sourced not having any subquery and should not have
    any aggregations or distincts (which incurrs RS), 
    lateral views and joins.
    1. minimal : SELECT STAR, FILTER on partition columns, LIMIT only
    2. more    : SELECT, FILTER, LIMIT only (+TABLESAMPLE, virtual columns)
  </description>
</property>


相關文章