[英]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.