你能解释一下何时以及为什么在配置单元中调用 mapreduce
Can you explain when and why mapreduce is invoked in hive
select * from Table_name limit 5;
select col1_name,col2_name from table_name limit 5;
当我 运行 第一个查询将不会调用 MapReduce,而对于其他查询则调用 MapReduce。能不能解释一下原因。
要理解其中的原因,首先我们需要知道map和reduce阶段是什么意思:-
Map: 基本上是一个按排序顺序过滤和组织数据的过滤器。例如它将从第二个查询中的一行中过滤 col1_name、col2_name。但是,在第一个查询中,您正在阅读每一列,不需要过滤。因此没有映射阶段
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;
这可以让您了解查询是如何在幕后执行的。它将向您显示阶段的依赖关系,以及如果任何聚合导致减少作业和运算符导致映射作业,会怎样。
select * from Table_name limit 5;
select col1_name,col2_name from table_name limit 5;
当我 运行 第一个查询将不会调用 MapReduce,而对于其他查询则调用 MapReduce。能不能解释一下原因。
要理解其中的原因,首先我们需要知道map和reduce阶段是什么意思:-
Map: 基本上是一个按排序顺序过滤和组织数据的过滤器。例如它将从第二个查询中的一行中过滤 col1_name、col2_name。但是,在第一个查询中,您正在阅读每一列,不需要过滤。因此没有映射阶段
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;
这可以让您了解查询是如何在幕后执行的。它将向您显示阶段的依赖关系,以及如果任何聚合导致减少作业和运算符导致映射作业,会怎样。