select * from Table_name limit 5;
select col1_name,col2_name from table_name limit 5;
当我运行第一个查询时,将不会调用MapReduce,而对于其他查询,则调用MapReduce。你能解释一下原因吗。
答案 0 :(得分:8)
要了解原因,首先我们需要知道哪些地图和减少阶段意味着: -
地图:基本上是按排序顺序过滤和整理数据的过滤器。对于例如它将从第二个查询中的行过滤col1_name,col2_name。但是,在第一个查询中,您正在读取每列,不需要过滤。因此没有地图阶段
Reduce :Reduce只是行中的摘要操作数据。例如一个coloumn的总和!在这两个查询中,您不需要任何摘要数据。因此没有减速器。
所以,第一个查询没有map-reduce,第二个查询只有mappers但没有减少。
答案 1 :(得分:8)
点击下面的简单配置单元查询:
Describe table;
这可以从hive Metastore读取数据,是hive中的简单和最快的查询。
select * from table;
此查询只需要从HDFS读取数据。到目前为止,既不需要任何地图也不需要减少阶段。
select * from table where color in ('RED','WHITE','BLUE')
此查询仅需要一个地图,没有减少阶段。没有任何类型的聚合函数。在这里,我们过滤收集RED,WHITE或BLUE的记录。
select count(1) from table;
此查询仅需要减少阶段。不需要映射,因为我们正在计算表中的所有记录。如果我们想要计算元素,那么我们将在reduce阶段之前添加一个map阶段。见下文:
Select color
, count(1) as color_count
from table
group by color;
此查询具有聚合函数和group by语句。我们计算表中元素的数量是RED,WHITE或BLUE。这种计算需要地图和减少工作。
基本上我们在上面的工作中创建一个键值对。我们将记录映射到密钥。在这种情况下,它将是RED,WHITE和BLUE。然后得到一个值。所以关键:值是颜色:1。然后我们可以将关键颜色的值相加。这是一张地图,减少了工作。
现在采用相同的查询和order by子句。
Select color
, count(1) as color_count
from table
group by color
order by colour_count desc;
这会增加另一个减少阶段,并强制使用单个reducer来传递数据集。这是必要的,因为我们希望确保维持全局排序。计数(不同的颜色)也会强制使用单个减速器,并且需要一个地图并减少相位。
当您为hive查询添加复杂性时,您将以类似的方式添加地图并减少获取请求结果所需的作业。
如果您想了解hive如何管理查询,您可以在查询前使用explain caluse。
Explain select * from table;
这可以让您了解查询是如何在幕后执行的。它将显示阶段的依赖关系以及如果任何聚合导致减少作业和运算符导致地图作业的情况。
答案 2 :(得分:1)
合乎逻辑。
在第一个查询中,只有要做的事情是--dump数据的限制为5(这意味着要转储任意5个行)。使用特定类型的查询处理时无需做任何事情。 (除了知道如何分隔行之外);
但在第二次查询中,地图 - 减少工作就在那里。为什么?因为首先它必须处理数据才能知道有多少不同的列。要知道col1和col1是否真的存在,或者只有一个col。如果存在,则必须首先消除其他列,而不是在其余列中,它只需要五行