簡體   English   中英

使用Hadoop Streaming和Python減少Map中的產品

[英]Cross Product in Map Reduce using Hadoop Streaming and Python

我正在學習Python和Hadoop。 我使用pythong + hadoop流完成了官方網站提供的設置和基本示例。 我考慮過實現2個文件的連接。 我完成了equi-join,檢查兩個輸入文件中是否出現相同的密鑰,然后按順序輸出密鑰以及文件1和文件2中的值。 等同連接按預期工作。

現在,我希望進行不等式連接,這涉及在應用不等式條件之前找到Cross Product。 我正在使用相同的映射器(我需要更改它)並且我更改了reducer以使其包含嵌套循環(因為file1中的每個鍵值對都必須與file2中的所有鍵值對匹配)。 這不起作用,因為您只能瀏覽一次流。 現在,我想到了在reducer中存儲'some'值並將它們進行比較的選項,但我不知道'怎么'很多。 朴素的方法是將整個file2內容存儲在一個數組(或類似的結構)中,但這是愚蠢的,違背了分布式處理的想法。 最后,我的問題是

  1. 如何在reducer中存儲值,以便我可以在兩個文件之間交叉產品?

  2. 在equi-join中,Hadoop似乎將相同鍵的所有鍵值對發送到同一個reducer,這非常好,適用於該情況。 但是,我如何改變這種行為(如果需要),以便所需的鍵值對分組正確的減速器?

示例文件: http//pastebin.com/ufYydiPu

Python Map / Reduce腳本: http//pastebin.com/kEJwd2u1

我使用的Hadoop命令:

bin/hadoop jar contrib/streaming/hadoop-*streaming*.jar -file /home/hduser/mapper.py -mapper mapper.py -file /home/hduser/ireducer.py -reducer reducer.py -input /user/hduser/inputfiles/* -output /user/hduser/join-output

非常感謝任何幫助/提示。

處理避免嵌套循環非常有用的多種組合的一種方法是使用itertools模塊。 特別是itertools.product函數,它使用生成器來處理笛卡爾積。 這有利於內存使用和效率,如果您必須在一個map reduce作業中連接多個數據集,它可以顯着簡化代碼。

關於映射器產生的數據與要在reducer中組合的數據集之間的對應關系,如果每個鍵的數據集不是太大,您可以簡單地從映射器中得到如下組合:

{key, [origin_1, values]}
{key, [origin_2, values]}

因此,您將能夠將reducer中具有相同原點的值分組為字典,這些字典將是使用itertools.product應用笛卡爾積的數據集。

暫無
暫無

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

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