我在hive中有一个表,我想从中获取所有数据。问题是:
select * from tbl;
给我的结果与:
非常不同select count(*) from tbl;
为什么?第二个查询似乎是运行hadoop map reduce,第一个不是 - 它只是返回结果。该表未进行分区或分区,它采用文本(csv)格式。
答案 0 :(得分:0)
当您提交Hive查询时,Hive会将查询转换为一个或多个阶段。阶段可以是MapReduce阶段,采样阶段,合并阶段,限制阶段或Hive需要执行的其他可能任务。
select * from table_name;
此查询只扫描整个表并将输出转储到屏幕上,因此您可以在控制台上看到不同的日志输出。
虽然select count(*) from table_name
只是扫描Hive meta_information并将结果放在他们自己的位置。它也不会运行任何MapReduce作业。
您可以在Hive控制台上运行以下命令,您将能够看到整个信息。
hive> describe formatted table_name
;
表格参数:
COLUMN_STATS_ACCURATE true
numFiles xx
numRows xxxxxxxx
在hadoop中,聚合/条件/算术运算等需要处理引擎来处理和执行结果,因此无论何时提交此类作业,它都会在内部转换为MapReduce程序,MapReduce程序代表查询并将其结果生成到屏幕上的hive和Hive显示,因此您会看到不同的结果。
您可以在查询前放置EXPLAIN
关键字,以查看查询计划和其他信息。
请参阅编程Hadoop Book,第10章,了解有关使用Hive EXPLAIN
功能的更多信息。