你能解释一下何时以及为啥在 hive 中调用 mapreduce

Posted

技术标签:

【中文标题】你能解释一下何时以及为啥在 hive 中调用 mapreduce【英文标题】:Can you explain when and why mapreduce is invoked in hive你能解释一下何时以及为什么在 hive 中调用 mapreduce 【发布时间】:2015-06-18 06:40:55 【问题描述】:

    select * from Table_name limit 5;

    select col1_name,col2_name from table_name limit 5;

当我运行第一个查询时,不会调用 MapReduce,而对于其他查询则调用 MapReduce。能否解释一下原因。

【问题讨论】:

这个问题已经解决了***.com/questions/10249020/… 以上两个查询都没有为我调用 MapReduce。这是为什么? (在我的例子中,select count(*) from myTable 确实调用了 MapReduce)。 【参考方案1】:

以下面的简单 Hive 查询为例:

Describe table;

这从 hive 元存储中读取数据,是 hive 中最简单和最快的查询。

select * from table;

这个查询只需要从 HDFS 读取数据。到目前为止,都不需要任何 map 或 reduce 阶段。

select * from table where color in ('RED','WHITE','BLUE')

这个查询只需要一个map,没有reduce阶段。没有任何类型的聚合函数。在这里,我们正在过滤以收集红色、白色或蓝色的记录。

select count(1) from table;

这个查询只需要一个 reduce 阶段。不需要映射,因为我们正在计算表中的所有记录。如果我们想跨元素计数,那么我们将在 reduce 阶段之前添加一个 map 阶段。见下文:

Select color
, count(1) as color_count 
  from table  
  group by color;

这个查询有一个聚合函数和一个 group by 语句。我们正在计算表中红色、白色或蓝色元素的数量。这种计数需要一个 map 和一个 reduce 作业。

本质上,我们在上述作业中创建了一个键值对。我们将记录映射到一个键。在这种情况下,它将是红色、白色和蓝色。然后产生一个值。所以键:值是颜色:1。然后我们可以对关键颜色的值求和。这是一个 map 和 reduce 工作。

现在采用相同的查询和 order by 子句。

Select color
, count(1) as color_count 
  from table  
  group by color
  order by colour_count desc;

这增加了另一个 reduce 阶段,并强制数据集通过一个 reducer。这是必要的,因为我们要确保维护全局排序。 Count(distinct color) 也强制使用单个 reducer,并且需要 map 和 reduce 阶段。

当您为 Hive 查询增加复杂性时,您可以以类似的方式添加 map 和 reduce 获得请求结果所需的作业。

如果您想了解 hive 将如何管理查询,您可以在查询前使用说明原因。

 Explain select * from table;

这可以让您了解查询是如何在后台执行的。它将向您展示阶段的依赖关系,以及是否有任何聚合导致 reduce 作业和运算符导致 map 作业。

【讨论】:

select count(1) from table 将同时运行 map 和 reduce 而不仅仅是 reduce 错了,没有键映射。严格来说是减少工作。 我在这个链接上添加了几个截图来解释我之前所说的[链接] (imgur.com/a/ZJoaT) 您的解释似乎并不完全正确。前任。 select * from table where color in ('RED','WHITE','BLUE') 没有为我运行任何 map-reduce 作业(explain 命令证实了这一点)。另一个例子select count(1) from table; 正在做 5 个映射器工作和 1 个减速器工作。尽管您的解释是有道理的,但这并不是蜂巢的工作方式。【参考方案2】:

要理解原因,首先我们需要知道map和reduce阶段是什么意思:-

    地图:基本上是一个过滤器,它按排序顺序过滤和组织数据。例如它将从第二个查询中的一行过滤 col1_name、col2_name。但是,在第一个查询中,您正在阅读每一列,不需要过滤。因此没有 Map 阶段

    Reduce:Reduce 只是跨行的汇总操作数据。例如一栏的总和!在这两个查询中,您都不需要任何摘要数据。因此没有减速器。

所以,第一个查询没有 map-reduce,第二个查询只有映射器但没有 reduce。

【讨论】:

感谢您的解释【参考方案3】:

这是合乎逻辑的。

在第一个查询中,唯一要做的就是 --dump 限制为 5 的数据(这意味着要转储任意 5 行)。对于特定类型的查询处理不做任何事情。 (除了知道如何分隔行);

但在第二个查询中,将有一个 map-reduce 作业。为什么 ??因为首先它必须处理数据以了解有多少不同的列。而不是知道 col1 和 col1 是否真的存在或其中只有一个 col。如果存在,则必须首先消除其他列,而不是在剩余的列中,它必须只占用五行

【讨论】:

以上是关于你能解释一下何时以及为啥在 hive 中调用 mapreduce的主要内容,如果未能解决你的问题,请参考以下文章

有人可以解释一下如何以及何时应该在 oracle 中使用 syscursor 吗? [关闭]

为啥使用片段,以及何时使用片段而不是活动?

为啥以及何时使用重组分支?

何时(以及为啥)引入 Python `__new__()`?

何时使用 Hadoop、HBase、Hive 和 Pig?

为啥以及何时需要展平 JSON 对象?