2017-10-28 5 views
0

私は、aggregateByKeyについて説明する以下のスカラーの例を見つけました。 スカラ例:上記のScalaのコードのPythonセットを使用したAggregateBykey

val pairs=sc.parallelize(Array(("a",3),("a",1),("b",7),("a",5))) 
import scala.collection.mutable.HashSet 
//the initial value is a void Set. Adding an element to a set is the first 
//_+_ Join two sets is the _++_ 
val sets = pairs.aggregateByKey(new HashSet[Int])(_+_, _++_) 
sets.collect 

出力は次のとおりです。私が間違っているかわからない

pair = sc.parallelize([("a",3),("a",1),("b",7),("a",5)]) 
sets=pair.aggregateByKey((set()),(lambda x,y:x.add(y)),(lambda x,y:x|y)) 
sets.collect() 

res5: Array[(String, scala.collection.mutable.HashSet[Int])] =Array((b,Set(7)), (a,Set(1, 5, 3))) 

私はPythonで上記Scalaのコードを書き直しました。 Pythonのコードは、次のエラーメッセージを返します。

AttributeError: 'NoneType' object has no attribute 'add' 
+0

は、一般的に言って、あなたがセットにNoneを追加していないしていることを意味します:セットを返す必要がありますが機能します。 Noneのインスタンスが連鎖集約で追加されるように呼び出されています。だからエラー。 'pair.aggregateByKey(set())、(lambda x、y:x.add(y))、(lambda x、y:x | y))とは何ですか? – skrubber

+0

私は、次の出力を生成したいと思います:(b、Set(7))、(a、Set(1、5、3))したがって、空のセットを作成し、キーに基づいて設定する要素を追加しました。 – Ravi

+0

前に私のコメントを参照してください、そのコードスニペットは、セットに割り当てることなく何を与えるのですか? – skrubber

答えて

1

機能addは、(それが更新されたセットを返さない)のセットを更新し、NoneTypeを返します。このNoneTypeは、関数の次の反復に渡されます。したがって、エラーが発生します。

def my_add(x, y): 
    x.add(y) 
    return x 
sets = pair.aggregateByKey(set(), my_add, lambda x, y: x|y) 
sets.collect() 

    [('b', {7}), ('a', {1, 3, 5})] 
+0

素晴らしい。驚くばかり。理解しています。ありがとうございました。 – Ravi

関連する問題