2016-05-08 14 views
0

rddの2つの浮動小数点型のキー付きタプルを、リストにキー付きタプルのリストと各キーのそれぞれの数に組み合わせるのが難しかった。私はrddを使用しています。これを行うにはcombineByKeyを使用します。 combineByKeyの外側にある3つのラムダに値を渡すと、私が期待する結果、タプルとカウントのリストのキーとタプルが得られます。しかし、私がcombineByKeyでこれを行うと、私は1つの定数値とカウントのリストのキーとタプルを取得します。私はここで何が欠けていますか?私は説明するために以下のREPL出力をキャプチャしました。Pyspark combineByKeyタプルとカウントのリスト

j = jnd.take(2) 

j

[[u'14225532965000', (0.2072, 82777.0)], [u'14217732824000', (0.20361902000000001, 77271.0)]] 
creCmb = (lambda v: ([v[1]], 1)) 
mrgVal = (lambda x, v: (x[0]+[v[1]], x[1]+1)) 
mrgCmb = (lambda x, y: (x[0]+y[0], x[1]+y[1])) 
x = creCmb(j[0]) 

x

([(0.2072, 82777.0)], 1) 
m = mrgVal(x, j[1]) 

m

([(0.2072, 82777.0), (0.20361902000000001, 77271.0)], 2) 
r = mrgCmb(m, m) 

r

([(0.2072, 82777.0), (0.20361902000000001, 77271.0), (0.2072, 82777.0), (0.20361902000000001, 77271.0)], 4) 
cmb = jnd.combineByKey(creCmb, mrgVal, mrgCmb) 
cmb.count() 
4513 
cmb.take(1) 
[(u'14225532026000', ([56917.0, 56917.0, 56917.0, 56917.0, 56917.0, 56917.0, 56917.0, 56917.0, 56917.0, 56917.0, 56917.0, 56917.0, 56917.0, 56917.0, 56917.0, 56917.0, 56917.0, 56917.0, 56917.0, 56917.0, 56917.0, 56917.0, 56917.0, 56917.0, 56917.0, 56917.0, 56917.0, 56917.0, 56917.0, 56917.0, 56917.0, 56917.0, 56917.0, 56917.0, 56917.0, 56917.0, 56917.0, 56917.0, 56917.0, 56917.0, 56917.0, 56917.0, 56917.0, 56917.0, 56917.0, 56917.0, 56917.0, 56917.0, 56917.0, 56917.0, 56917.0, 56917.0, 56917.0, 56917.0, 56917.0, ... 
... 56917.0, 56917.0, 56917.0, 56917.0, 56917.0, 56917.0, 56917.0, 56917.0, 56917.0, 56917.0, 56917.0, 56917.0, 56917.0], 741))] 

答えて

0

combineByKeyのみ値各行のにそれに設けられた関数を呼び出します。 creCmbmrgValの場合、vの代わりにv[1]を使用すると、各値タプルの2番目の要素のみが保持され、最後に単一要素のリストが生成されます。あなたのテストでは、ちょうど値タプルの代わりにキーと値のペアでcreCmbを呼び出します。そのため、テスト出力は正しいものの、combineByKey出力は正しくありません。この問題を解決するには

、単にcreCmbmrgVal両方から[1]インデックスを削除します。

creCmb = (lambda v: ([v], 1)) 
mrgVal = (lambda x, v: (x[0]+[v], x[1]+1)) 
+0

私はcreCmbからインデックスを削除し、そしてまたmrgVal、それは同じ問題を持っているでしょう。私は今2つの倍数と1つのカウントのタプルのリストを取得しますが、2つの2つのタプルはすべて同じです。 [(u'14225532026000 '、([(0.1901883299999999999,56917.0)、(0.1901883299999999999、56917.0)、...(0.19018832999999999,56917.0)、(0.19018832999999999、56917.0)]、741))] – dmbaker

+0

@dmbaker奇妙なことに、私。私はあなたのコードを貼り付け、 '[1]'を 'creCmb'と' mrgVal'から取り除いたので、 '' lambda v:([v]、1) ''、 'λx、v:(x x [0] + [v]、x [1] +1) '、'λx、y:(x [0] + y [0]、x [1] + y [1]) '。私は無作為に選ばれた10000のテスト要素を持つ私の会社のクラスタでそれを走らせ、タプルはすべて異なっていました。私は何が起こっているのか分からない - あなたのデータについて何か不思議なことはありますか? –

+0

あなたのソリューションは素晴らしい仕事をしました。ラムダを修正した後、私は自分のデータロジックに問題を見つけることができました。ありがとうございました。 – dmbaker

関連する問題