2013-03-05 78 views
1

我擺弄周圍有GAE MapReduce和有一個問題:GAE的MapReduce:定義參數作業

是否有可能只改變一個變量中的MapReduce一定的工作嗎?

我問的原因是:

輸入CSV和我的MapReduce工作的輸出CSV都應該有相同的標題行 - 但是,標題行是介於輸出CSV,但從來沒有在最佳。爲了得到正確的標題行,我在Reduce函數中插入了一個計數器,用於檢查Reduce作業的當前迭代,如果爲0,則會將硬編碼標題行傳遞到管道。當輸出csv存儲在blobstore中時,計數器會重置。

問題:計數器通常會隨機重置,可能是因爲我不得不將它定義爲函數外的全局變量「reduce_counter = 0」。

是否有任何方法鏈接變量/參數的工作或有沒有更好的方式來獲得header_row?

我不認爲我可以使用DictReader或csv模塊,因爲輸出存儲在blobstore中,而blobstore對象不能被更改,據我所知。

您可以在main.py文檔的www.github.com/jvdheyden/ste上找到我的代碼。

謝謝!

回答

0

您應該在mapreduce作業完成後添加標題。您可以通過任務完成後訪問輸出CSV做到這一點:發生

orig_file = gcs.open(filename_from_mapreduce) 
new_file = gcs.open(filename_from_mapreduce + "_with_headers", "r") 

new_file.write("your,csv,headers,here") 
while True: 
    read = orig_file.read() 
    if read == '': 
     break 
    output.write(read) 

output.close() 
gcs.delete(orig_file) 

你的問題,因爲GAE處理多個碎片MapReduce任務的。美麗之處在於,每個小任務都是並行執行的,這爲我們在大量數據上獲得了巨大的時間優勢。

這也解釋了爲什麼您的CSV標頭隨機出現,而每個分片只要它完成工作就將其輸出。因此,你無法可靠地預測寫出輸出的第一行的那個。