select * from Table_name limit 5;
select col1_name,col2_name from table_name limit 5;
当我运行第一个查询时,将不会调用MapReduce,而对于其他查询,则调用MapReduce.你能解释一下原因吗?
Man*_*odi 10
要了解原因,首先我们需要知道哪些地图和减少阶段意味着: -
Map:基本上是按排序顺序过滤和组织数据的过滤器.例如,它将从第二个查询中的行过滤col1_name,col2_name.但是,在第一个查询中,您正在读取每列,不需要过滤.因此没有地图阶段
Reduce:Reduce只是行中的汇总操作数据.例如,一个coloumn的总和!在这两个查询中,您不需要任何摘要数据.因此没有减速器.
所以,第一个查询没有map-reduce,第二个查询只有mappers但没有减少.
inv*_*ell 10
以下是简单的hive查询:
Describe table;
Run Code Online (Sandbox Code Playgroud)
这从hive Metastore读取数据,是hive中的简单和最快的查询.
select * from table;
Run Code Online (Sandbox Code Playgroud)
此查询只需要从HDFS读取数据.到目前为止,既不需要任何地图或减少阶段.
select * from table where color in ('RED','WHITE','BLUE')
Run Code Online (Sandbox Code Playgroud)
此查询仅需要一个地图,没有减少阶段.没有任何类型的聚合函数.在这里,我们过滤收集RED,WHITE或BLUE的记录.
select count(1) from table;
Run Code Online (Sandbox Code Playgroud)
此查询仅需要减少阶段.不需要映射,因为我们正在计算表中的所有记录.如果我们想要计算元素,那么我们将在reduce阶段之前添加一个map阶段.见下文:
Select color
, count(1) as color_count
from table
group by color;
Run Code Online (Sandbox Code Playgroud)
此查询具有聚合函数和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;
Run Code Online (Sandbox Code Playgroud)
这会增加另一个减少阶段,并强制单个减速器为数据集传递.这是必要的,因为我们希望确保维持全局排序.计数(不同的颜色)也会强制使用单个减速器,并且需要一个地图并减少相位.
当您为hive查询添加复杂性时,您将以类似的方式添加地图并减少获取请求结果所需的作业.
如果您想了解配置单元如何管理查询,您可以在查询前使用说明caluse.
Explain select * from table;
Run Code Online (Sandbox Code Playgroud)
这可以让您了解查询是如何在幕后执行的.它将显示阶段的依赖关系以及如果任何聚合导致减少作业和运算符导致映射作业的情况.
归档时间: |
|
查看次数: |
8087 次 |
最近记录: |