簡體   English   中英

MAP(PySpark)返回的元組的列表(或迭代器)

[英]List (or iterator) of tuples returned by MAP (PySpark)

我有一個mapper方法:

def mapper(value):
    ...
    for key, value in some_list:
        yield key, value

實際上,我需要的是與普通的wordcount示例相差不遠。 我已經有了工作腳本,但只有當mapper方法看起來像這樣:

def mapper(value):
    ...
    return key, value

這就是它的調用方式:

sc.textFile(sys.argv[2], 1).map(mapper).reduceByKey(reducer).collect()

我花了2個小時嘗試編寫支持mapper生成器的代碼。 但不能這樣做。 我甚至同意只返回一份清單:

def mapper(value):
    ...
    result_list = []
    for key, value in some_list:
        result_list.append( key, value )
    return result_list

在這里: https ://groups.google.com/forum/#!searchin/spark-users/flatmap $ 20multiple / spark-users / 1WqVhRBaJsU / -D5QRbenlUgJ我發現我應該使用flatMap,但它沒有做到這一點 - 然后我的reducer開始得到像(key1,value1,key2,value2,value3,...)這樣的輸入 - 但它應該是[(key1,value1),(key2,value2,value3)...]。 換句話說,reducer開始只使用單個部分,並且不知道它是值還是鍵,以及值是否 - 它屬於哪個鍵。

那么如何使用返回迭代器或列表的映射器呢?

謝謝!

如果需要返回多個輸出的map函數,可以使用flatMap

傳遞給flatMap的函數可以返回一個iterable:

>>> words = sc.textFile("README.md")
>>> def mapper(line):
...     return ((word, 1) for word in line.split())
...
>>> words.flatMap(mapper).take(4)
[(u'#', 1), (u'Apache', 1), (u'Spark', 1), (u'Lightning-Fast', 1)]
>>> counts = words.flatMap(mapper).reduceByKey(lambda x, y: x + y)
>>> counts.take(5)
[(u'all', 1), (u'help', 1), (u'webpage', 1), (u'when', 1), (u'Hadoop', 12)]

它也可以是一個發電機功能:

>>> words = sc.textFile("README.md")
>>> def mapper(line):
...     for word in line.split():
...         yield (word, 1)
...
>>> words.flatMap(mapper).take(4)
[(u'#', 1), (u'Apache', 1), (u'Spark', 1), (u'Lightning-Fast', 1)]
>>> counts = words.flatMap(mapper).reduceByKey(lambda x, y: x + y)
>>> counts.take(5)
[(u'all', 1), (u'help', 1), (u'webpage', 1), (u'when', 1), (u'Hadoop', 12)]

你提到過你嘗試過flatMap但它把所有東西都縮小為一個列表[key, value, key, value, ...]而不是列表[(key, value), (key, value)...]鍵 -價值對。 我懷疑這是你的地圖功能中的一個問題。 如果您仍然遇到此問題,可以發布更完整版的地圖功能嗎?

暫無
暫無

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

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