我在 hive 中有一个表,我想从中获取所有数据。问题是:
select * from tbl;
给我的结果与以下情况截然不同:
select count(*) from tbl;
这是为什么?第二个查询似乎正在运行hadoop map reduce,第一个查询不运行-它只是返回结果。该表未分区或存储,而是文本(csv)格式。
最佳答案
提交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,因此您会看到不同的结果。
您可以将
EXPLAIN
关键字放在查询前面,以查看查询计划和其他信息。请参阅《编程Hadoop手册》第10章,以了解有关使用Hive
EXPLAIN
功能的更多信息。
关于hadoop - 一个查询运行map reduce,另一个查询不运行map reduce,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41586964/