2016-11-17 6 views
1

( 'pyspark'では)複数の辞書を含むRDDがあります。これらの辞書にはそれぞれ複数の辞書が含まれています。それは次のようになります。Sparkでネストされた辞書を減らす方法

label1 : {tag1, : count = 2, tag2: count = 3}, {tag2 : count = 3}, {tag3 : count = 1}, ... 
label2 : {tag1, : count = 2, tag3: count = 2}, {tag2 : count = 5}, {tag4 : count = 3}, ... 
. 
. 

この構造を考えると、私は結果は次の形式を持っているので、辞書を「削減」できるようにしたいと思います:

label1 : {tag1 : count = 2}, {tag : count = 6}, {tag3 : count = 1} ... 
label2 : {tag1 : count = 2}, {tag2 : count = 5}, {tag3 : count = 2}, {tag4 : count = 3}... 
. 
. 
. 

私は、これは似ている感じを持っています'減らす'または '結合する'または 'グループバイ'であるが、適切な機能を見つけるのが難しい。 Sparkのどの機能がこの作業を達成するかもしれないかを教えてください。ありがとう!

+0

理論的には、何を表すのかは問題ではないはずです。概念的には、Sparkのドキュメントによれば、キー(この場合は 'label')を「iterable」(タグをカウントする辞書のリスト)にマップするGroupByKey()を実行しました。 GroupByKey()へのこの呼び出しの結果は上に示されています。 – jkovba

+0

あなたはおそらく 'GroupByKey'をしたくないでしょう。それはあなたの辞書をiterableに置くからです。代わりに、RDD内で処理を行った後にグループ化する必要があります(本当に必要な場合)。あなたは 'flatten'または' flatmap'を実行し、それからあなたが望むように整理することに目を向けましたか? –

+0

ありがとう@EricM。 label3のように、どのファイルにも表示できるファイルがたくさんあります。私はSparkの新人ですが、私のアプローチは、すべてのファイルでlabel3が指すすべての辞書を集めて、それらを「反復可能」にすることでした。そして、私はその "反復可能な"全体に集約したいと思います。私はスタブを取って、GroupByKey()に "必要"と言っていますが、私はそれを確実にしていません。 – jkovba

答えて

0

これは一つの大きな辞書に辞書のあなたのイテレータを平らにする必要があります

def combine(iter): 
    bigDict = dict() 
    for littleDict in iter: 
     for key, value in littleDict.iteritems(): 
      bigDict[key] = value 
    return bigDict 
rdd.map(combine) 
関連する問題