当我们在hive
中简单地选择*查询时,为什么没有启动Mapreduce程序select * from emp;
select * from emp limit 10;
select * from from limit 2;
对于上面的hive查询,没有启动mapreduce程序。
select id from emp;
select id,name from emp;
select * from emp where id>100;
对于上面的3个hive查询,map reduce程序会被启动。
为什么?有人可以解释一下
答案 0 :(得分:2)
无论何时运行普通'选择*',都会创建一个获取任务,而不是mapreduce任务,它只是按原样转储数据而不对其执行任何操作。这等同于:
hadoop fs -cat $file_name
因此,在前三次查询的情况下,会调用一个获取任务,这只是做猫并显示数据。
对于其他查询,将调用一个map作业,根据您的条件过滤整行(例如,从所有列中选择id)并为您提供输出
答案 1 :(得分:0)
您可以在hive客户端中使用解释sql。
explain select * from tablename;
The execution plan:
STAGE PLANS:
Stage: Stage-0
Fetch Operator
limit: 10
Processor Tree:
TableScan
alias: tablename
explain select dt from tablename;
STAGE PLANS:
Stage: Stage-1
Map Reduce
Alias -> Map Operator Tree:
src_f_log_user_leave
TableScan
alias: tablename
上面两个sql的区别首先是fetch运算符,另一个是Map运算符树。