SET hive.fetch.task.conversion=none;
Hive快捷查询:不启用Mapreduce job启用Fetch task
如果你想查询某个表的某一列,Hive默认是会启用MapReduce Job来完成这个任务。
启用MapReduce Job是会消耗系统开销的。
对于这个问题,从Hive0.10.0版本开始,
对于简单的不需要聚合的
类似SELECT <col> from <table> LIMIT n
语句,
不需要起MapReduce job,直接通过Fetch task获取数据
hive.fetch.task.conversion
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)
问题:大表线性扫描查询速度过慢
对于大表没有聚合的明细查询,hive默认不走tez/MR job。
而大表线性扫描查询速度过于慢,原因:对于没有聚合的明细数据查询,hive默认采用无任务模式降低启动yarn作业的开销。
Hive中对某些情况的查询可以不必使用MapReduce计算
Hive中对某些情况的查询可以不必使用MapReduce计算。
比如:
SELECT * FROM employees;
在这种情况下,Hive可以简单地读取employee对应的存储目录下的文件,然后输出查询结果到控制台。
案例
把hive.fetch.task.conversion设置成none,然后执行查询语句,都会执行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)
把hive.fetch.task.conversion设置成more,然后执行查询语句,如下查询方式都不会执行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)