2013-04-30 31 views
1

我想使用AWS EMR對輸入文件進行分區。 我使用流式步驟從標準輸入讀取。
我想根據stdin的每一行中的特定字段的值將此文件拆分爲2個文件,並將結果輸出存儲到S3中以供稍後使用。 我找不到任何有關如何使用python實現這一目標的文檔。 你能指出我正確的方向嗎? 我將不勝感激。地圖減少python boto中的多個輸出

謝謝

回答

1

不完全確定你有什麼問題。這裏有一篇好文章 - http://aws.amazon.com/articles/2294

你的具體問題是,你想創建一個映射器,它將你的文件作爲輸入,並將每行分割成一個鍵,值對(鍵確定它將在哪個輸出文件中),你的減速器將只需輸出這些,一個沒有操作。

映射

#!/usr/bin/python 

def main(): 
    for line in sys.stdin: 
     key = get_my_key(line) 
     value = line 
     print '{}\t{}'.format(key, value) 

if __name__ == "__main__": 
    main() 

減速

#!/usr/bin/python 

def main(): 
    for line in sys.stdin: 
     print line 

if __name__ == "__main__": 
    main() 

當你加入這一步您指定的輸入,輸出(部分S3存儲桶),這些文件作爲mapper和減速。

請注意,有一些配置不能設置縮減器,只是一個映射器任務。我已經包含了以上所有內容,因爲您似乎是初學者

+0

感謝您的迅速回復。如果我理解正確,映射器將決定如何分割輸入文件(這是我寫入條件的地方)。 我感到困惑的是如何創建我想要的2個文件。Reducer的工作是將不同的鍵值對輸出到輸出文件。每種鍵值對都有一個減速器,因此有兩個輸出文件? – Zihs 2013-04-30 17:53:02

+0

你好, 我能夠在修改後運行你的代碼。 EMR作業返回3個文件(part-00000,part-00001,part-00002)。它們都包含與我在代碼中指定的鍵和值字段相匹配的數據。 但是,我想將與特定字段值匹配的所有記錄保存到1個文件中,並將所有其他記錄保存到另一個文件中。這種技術疏遠了我想要的記錄,但忽略了其他記錄。有任何想法嗎? – Zihs 2013-04-30 21:07:41

+0

你的'get_key'函數應該在1個文件中返回一個你想要的字段值的鍵值,然後爲所有其他記錄分別返回一個鍵值 – Shane 2013-05-01 13:54:31