Fetch 抓取是指,Hive 中對(duì)某些情況的查詢可以不必使用 MapReduce 計(jì)算。
啟用 MapReduce Job 是會(huì)消耗系統(tǒng)開銷的。對(duì)于這個(gè)問題,從 Hive0.10.0 版本開始,對(duì)于簡(jiǎn)單的不需要聚合的類似
select <col> from <table> limit n語句,不需要起 MapReduce job,直接通過 Fetch task 獲取數(shù)據(jù)。
比如:select * from user_table;在這種情況下,Hive 可以簡(jiǎn)單地讀取 user_table 對(duì)應(yīng)的存儲(chǔ)目錄下的文件,然后輸出查詢結(jié)果到控制臺(tái)。
在 hive-default.xml.template 文件中hive.fetch.task.conversion默認(rèn)是 more,老版本 hive 默認(rèn)是 minimal,該屬性修改為 more 以后,在全局查找、字段查找、limit 查找等都不走 MapReduce。
<property>
<name>hive.fetch.task.conversion</name>
<value>more</value>
<description>
Expects one of [none, minimal, more].
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 incurs RS), lateral views and joins.
0. none : disable hive.fetch.task.conversion
1. minimal : SELECT STAR, FILTER on partition columns, LIMIT only
2. more : SELECT, FILTER, LIMIT only (support TABLESAMPLE and virtual columns)
</description>
</property>
1)把hive.fetch.task.conversion設(shè)置成none,然后執(zhí)行查詢語句,都會(huì)執(zhí)行mapreduce程序。
hive (default)> set hive.fetch.task.conversion=none;
hive (default)> select * from emp;
hive (default)> select ename from emp;
hive (default)> select ename from emp limit 3;
Time taken: 18.203 seconds, Fetched: 14 row(s)
2)把hive.fetch.task.conversion設(shè)置成more,然后執(zhí)行查詢語句,如下查詢方式都不會(huì)執(zhí)行mapreduce程序。
hive (default)> set hive.fetch.task.conversion=more;
hive (default)> select * from emp;
hive (default)> select ename from emp;
hive (default)> select ename from emp limit 3;
Time taken: 0.09 seconds, Fetched: 3 row(s)