我如何知道SQL查询中的映射内容和减少的内容?

时间:2013-04-10 02:18:01

标签: hadoop hive

我阅读了MapReduce wiki页面,我认为我并不完全理解。我知道查询被分成了一个map步骤和一个reduce步骤。因此,为了利用这一点,我们应该更多地使用GROUP BY并将工作从map步骤移到reduce步骤。我不确定这是如何工作的。看起来很神奇。我想知道一组编写SQL查询的指南,以利用MapReduce。

我如何知道地图步骤或缩小步骤中的哪些子句?它背后的理论是什么?我想理解这个理论及其内部运作,以便我可以写出更好的查询。

2 个答案:

答案 0 :(得分:0)

地图功能为data preparation stage,其中Mapper可以prepare and filter数据,以便它可以将输入传递给reducer function。 Reducer从Mapper获取输入,并尝试在查询中指定时减少数据。 例如,reducer将从mapper给出的数据中计算像count,max,min of a column这样的聚合。 例如,我需要finding word count for the words not in set a,an and the

not filtering is done by mapper.

counting is done by by reducer.

根据我的理解,Hive查询中的三件事将导致reducer功能。

1.group by

2.join

3.multi row function 

其余大部分将导致Mapper功能。

答案 1 :(得分:0)

Hive会尽可能地根据查询来优化map /的数量(以及map和reduce之间的工作)。如果你想控制map / reduce行为你可以在java中编写自己的map / reduce,Hive的全部意义在于它会让你使用熟悉的语法(SQL)来表达你想要的结果,它会创建一个有效的map / reduce序列来获得该结果

出于性能原因,您可能希望在映射阶段尽可能多地完成工作 - 因为通常有更多的映射器而不是reducer,并且您不需要移动数据。请注意,有时聚合函数可以使用组合器在地图端部分执行(尽管我认为Hive处理方式不同) 来自Hive site

  

分组的地图侧聚合

     

hive.map.aggr控制我们如何进行聚合。默认值为false。   如果设置为true,Hive将执行第一级聚合   直接在地图任务中。这通常可以提供更好的效率,但是   可能需要更多内存才能成功运行。

     

set hive.map.aggr = true;     SELECT COUNT(*)FROM table2