私はPythonでSparkを学習しようとしていますが、combineByKey
でキーと値のペアの値の平均をとっています。実際、私の混乱はcombineByKey
の構文ではなく、その後になるものです。典型的な例(O'Rielly 2015 Learning Spark Book)は、多くの場所でウェブ上で見ることができます。 here's one。Python Spark combineByKey Average
問題はsumCount.map(lambda (key, (totalSum, count)): (key, totalSum/count)).collectAsMap()
ステートメントにあります。 spark 2.0.1とiPython 3.5.2を使用すると、構文エラー例外がスローされます。それを単純化すると(そして、O'Reillyの本にある):sumCount.map(lambda key,vals: (key, vals[0]/vals[1])).collectAsMap()
は、SparkがJavaの例外を使ってバットに夢中になりますが、私はTypeError: <lambda>() missing 1 required positional argument: 'v'
というエラーを記録します。
Spark & Pythonの最新バージョンで実際に動作するこの機能の例を教えてもらえますか?完全を期すために、私は私自身の最小作業(というか、非稼働)の例を含めました:
In: pRDD = sc.parallelize([("s",5),("g",3),("g",10),("c",2),("s",10),("s",3),("g",-1),("c",20),("c",2)])
In: cbk = pRDD.combineByKey(lambda x:(x,1), lambda x,y:(x[0]+y,x[1]+1),lambda x,y:(x[0]+y[0],x[1]+y[1]))
In: cbk.collect()
Out: [('s', (18, 3)), ('g', (12, 3)), ('c', (24, 3))]
In: cbk.map(lambda key,val:(k,val[0]/val[1])).collectAsMap() <-- errors
をそれは[(e[0],e[1][0]/e[1][1]) for e in cbk.collect()]
を計算するのは簡単だが、私はむしろ働く「Sparkic」の方法を取得したいです。ステップによる
ありがとうございましたが、この質問に既に投稿されているすべてのものが明確になるので、私は特に 'combineByKey' - >' map'オペレーションがエラーを起こした理由について質問していました。 –