7

私はマッパーメソッドを持っています:

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

私が必要としているのは、実際には、通常の wordcount の例からそれほど離れていません。私はすでに作業中のスクリプトを持っていますが、マッパーメソッドが次のようになっている場合のみ:

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

これはその呼び出しがどのように見えるかです:

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

マッパーでジェネレーターをサポートするコードを書くのに 2 時間費やしました。しかし、それはできませんでした。リストを返すことにも同意します:

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 を使用する必要があることがわかりましたが、うまくいきませんでした-その後、レデューサーは(key1、value1、key2、value2、value3、...)のような入力を取得し始めました-しかし、それは[(key1、value1)、(key2、value2、value3)...]である必要があります。言い換えれば、リデューサーは単一のピースのみを取り始め、それが値なのかキーなのか、そして値の場合はどのキーに属するのかを知りません。

では、イテレータまたはリストを返すマッパーを使用するにはどうすればよいでしょうか?

ありがとう!

4

1 に答える 1

11

flatMap複数の出力を返すマップ関数が必要な場合に使用できます。

に渡された関数はflatMap、イテラブルを返すことができます:

>>> 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)...]

于 2014-01-13T18:20:03.110 に答える