我有一个查询,其中我们创建了Hive表,当我们select * from table where=< condition>;
时,它立即给出结果而不调用MR作业。当我创建相同的重复表并尝试执行查询时,则调用MR。可能的原因是什么?
答案 0 :(得分:0)
我得到了答案,原因是桌子上发出了Hive analyze命令。一旦执行hive analyze命令,它就会在hive metastore中存储行数,文件大小。所以,当你选择count(*)时table.It直接从hive Metastore中取出它,而不是调用map reduce工作。 您也可以在列上发出分析命令。
ANALYZE TABLE [db_name.]tablename [PARTITION(partcol1[=val1], partcol2[=val2], ...)] -- (Note: Fully support qualified table name since Hive 1.2.0, see HIVE-10007.)
COMPUTE STATISTICS
[FOR COLUMNS] -- (Note: Hive 0.10.0 and later.)
[CACHE METADATA] -- (Note: Hive 2.1.0 and later.)
[NOSCAN];
文档链接: https://cwiki.apache.org/confluence/display/Hive/StatsDev
答案 1 :(得分:0)
本地模式(配置单元不调用MR)取决于几个条件(参见HIVE-1408):
hive.exec.mode.local.auto=true/false
- 让Hive确定是否自动以本地模式运行。hive.exec.mode.local.auto.input.size.max=1G
- 当hive.exec.mode.local.auto
为真时,对于本地模式,输入字节应小于此值。hive.exec.mode.local.auto.input.files.max=4
- 当hive.exec.mode.local.auto
为真时,本地模式下的任务数应小于此值。如果表格具有相同的数据,我的猜测是,在查询两个表时导致一个查询在本地模式下运行而另一个查询生成MR作业时产生的任务数量存在差异。