你能解释一下何时以及为什么在配置单元中调用 mapreduce

Can you explain when and why mapreduce is invoked in hive

  1. select * from Table_name limit 5;

  2. select col1_name,col2_name from table_name limit 5;

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

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

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

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

因此,第一个查询没有 map-reduce,第二个查询只有映射器但没有减少。

符合逻辑。

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

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

采用下面的简单配置单元查询:

Describe table;

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

select * from table;

本次查询只需要从HDFS读取数据。到目前为止,既不需要任何 map 阶段也不需要 reduce 阶段。

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

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

select count(1) from table;

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

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

这个查询有聚合函数和group by语句。我们正在计算 table 中红色、白色或蓝色元素的数量。此计数需要映射和减少作业。

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

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

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

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

当您增加配置单元查询的复杂性时,您会以类似的方式添加地图并减少获得请求结果所需的作业。

如果您想了解 hive 将如何管理查询,您可以在查询前使用解释语句。

 Explain select * from table;

这可以让您了解查询是如何在幕后执行的。它将向您显示阶段的依赖关系,以及如果任何聚合导致减少作业和运算符导致映射作业,会怎样。