簡體   English   中英

如何在 Hadoop 中減少步驟差異?

[英]How to steps differences reduce in Hadoop?

如何在 Hadoop 中減少步驟差異?
我對理解 Hadoop 有疑問。我有兩個文件,首先我在這些文件之間進行了連接。 一個文件是關於國家的,另一個是關於每個國家的客戶的。
例如,clients.csv:

Bertram Pearcy  ,bueno,SO
Steven Ulman  ,regular,ZA

Countries.csv

Name,Code   
Afghanistan,AF
Ã…land Islands,AX
Albania,AL  
…

我做了一個 map reduce,它告訴我有多少“好”(bueno)客戶有一個國家(ZA,SO)和國家。csv 我知道我們正在談論的國家。

我編程:

def steps(self): 
        # ordenamos las operaciones para su ejecución.
        return [ 
            MRStep(mapper=self.mapper 
                   ,reducer=self.reducer),            
            MRStep(mapper=self.mapper1
                   ,combiner=self.combiner_cuenta_palabras
                   ,reducer=self.reducer2
                    ),
        ]  

我的 map/reduce 的結果是:

["South Georgia and the South Sandwich Islands"]    1
["South Sudan"] 1
["Spain"]   3

現在,我想知道哪一個是最好的。

我加了一個減少更多。

    def reducer3(self, _, values):            
        yield  _, max (values)
        
    def steps(self): 
        # ordenamos las operaciones para su ejecución.
        return [ 
            MRStep(mapper=self.mapper 
                   ,reducer=self.reducer),  
            MRStep(mapper=self.mapper1
                   ,combiner=self.combiner_cuenta_palabras
                   ,reducer=self.reducer2),
            MRStep(#mapper=self.mapper3,
                   reducer=self.reducer3
                   #,reducer=self.reducer3
            ),            
        ]   

但我的答案與沒有那個減速器的答案相同


我嘗試使用一個 map/reduce 程序添加另一個 reduce。 它不起作用。

通過我的第一次減少,我得到了:

A, 10
C, 2
D, 5

現在,我想使用我得到的結果:A,10

附加評論:

INPUT [Fille1]+[File2] =>在此處輸入圖像描述

映射/減少 => 輸出

在此處輸入圖像描述

現在,我需要通過額外的 map/reduce(我想使用我所做的)得到另一個答案。

第一)例如,一個且唯一的答案。 示例: 3 Spain

第二)所有最好或更大的數字, 3 Spain3 Guan

我嘗試使用:

def reducer3(self, _, values):            
        yield  _, max (values)

我補充說,

def steps(self): 
        # ordenamos las operaciones para su ejecución.
        return [ 
            MRStep(mapper=self.mapper 
                   ,reducer=self.reducer),  
            MRStep(mapper=self.mapper1
                   ,combiner=self.combiner_cuenta_palabras
                   ,reducer=self.reducer2),
            MRStep(reducer=self.reducer3
            ),            
        ]    

但我仍然有相同的結果。 我知道 REDUCER3 正在使用,因為如果我寫max(values)+1000給我相同的結果但數字10011003

你的 reducer 有 3 個不同的鍵,因此你找到每個鍵的最大值,而values只有一個元素(嘗試打印它的長度......)。 因此,您會得到 3 個結果。

例如,您需要第三個返回(None, f'{key}|{value})的映射器,然后所有記錄將被發送到一個 reducer ,然后您可以在其中迭代、解析和聚合結果

def reducer3(self, _, values):
    _max = float('-inf')
    k_out = None
    for x in values:
        k, v = x.split('|')
        if int(v) > _max:
            _max = v
            k_out = k
    yield  k_out, _max

這只會為所有值返回一個結果。 如果你想捕獲相等的最大值,我認為你需要多次遍歷列表,然后在找到的最大元素的循環中產生

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM