2015-06-18 27 views

回答

1

要明白其中的道理,首先我們需要知道什麼地圖和降低相間的意思是: -

  1. 地圖:基本上是一個過濾器,過濾器和有序組織數據。對於例如它將在第二個查詢中從一行中過濾col1_name,col2_name。但是,在第一個查詢中,您正在讀取每一列,不需要過濾。因此,沒有地圖階段

  2. 減少:減少只是跨行的彙總操作數據。例如, coloumn的總和!在這兩個查詢中,您都不需要任何彙總數據。因此沒有減速器。

所以,第一個查詢爲map-reduce,第二個查詢只有mappers但沒有縮小。

+0

感謝您的解釋 –

1

它的邏輯。

在第一個查詢中,只有要做的事情是 - 轉儲數據限制爲5(這意味着要轉儲任意5行數據)。沒有辦法用特定類型的查詢進行處理。 (除了知道行是如何分開的);

但在第二個查詢地圖 - 減少工作就在那裏。爲什麼?因爲首先必須處理數據以知道有多少個不同的列。直到知道col1和col1是否真的存在或者只有一個列。如果不存在比它第一,比其餘列有采取只五行消除等欄目也

3

採取下面的簡單蜂巢查詢:

Describe table; 

這從蜂巢metastore讀取數據和是配置單元中的簡單和最快的查詢。

select * from table; 

該查詢只需要從HDFS讀取數據。到目前爲止,不需要任何地圖或縮小階段。

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

此查詢只需要一張地圖,沒有縮小階段。沒有任何聚合功能。在這裏,我們正在過濾收集紅色,白色或藍色的記錄。

select count(1) from table; 

此查詢只需要一個縮小階段。不需要映射,因爲我們正在計算表中的所有記錄。如果我們想要跨越元素進行計數,那麼我們將在縮小階段之前添加一個映射階段。如下所示:

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

該查詢具有聚合函數和group by語句。我們正在統計表格中紅色,白色或藍色的元素數量。這種計算需要一張地圖和一份減少的工作。

本質上,我們在上述工作中創建了一個關鍵值對。我們將記錄映射到密鑰。在這種情況下,它將是紅色,白色和藍色。然後,創建一個值。所以關鍵:價值是顏色:1。然後我們可以對整個關鍵顏色的值進行求和。這是一張地圖和減少工作。

現在採取相同的查詢和按順序的條款。

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

這增加了另一個縮小階段,並強制數據集的一個reducer通過。這是必要的,因爲我們要確保維護全局排序。 Count(不同的顏色)也強制一個reducer並需要一個map和reduce階段。

當您以類似的方式增加配置單元查詢的複雜性時,可以添加地圖並減少獲取請求結果所需的作業。

如果您想了解hive如何管理查詢,您可以在查詢前使用explain caluse。

Explain select * from table; 

這可以讓你瞭解如何在引擎蓋下執行查詢。它會向你展示階段的依賴關係,以及如果任何聚合導致減少工作並且操作員導致地圖工作。

+1

select count(1)from table會同時運行地圖和減少不僅減少 – Nitin

+0

這是錯誤的,沒有關鍵映射。嚴格減少工作。 – invoketheshell

+0

我已經在這個鏈接添加了幾個截圖來解釋我之前說的[鏈接](http://imgur.com/a/ZJoaT) – Nitin