0

私の問題は次のとおりです。ユーザーの対話を解析しています。対話が検出されるたびに ((user1,user2),((date1,0),(0,1))) を出力します。ゼロは相互作用の方向を示しています。

次のreduce関数を使用してこの出力を削減できない理由がわかりません。

def myFunc2(x1,x2):
    return (min(x1[0][0],x2[0][0]),max(x1[0][0],x2[0][0]),min(x1[0][1],x2[0][1]),max(x1[0][1],x2[0][1]),x1[1][0]+x2[1][0],x1[1][1]+x2[1][1])

私のマッパー (flatmap(myFunc)) の出力は正しいです:

((7401899, 5678002), ((1403185440.0, 0), (1, 0)))
((82628194, 22251869), ((0, 1403185452.0), (0, 1)))
((2162276, 98056200), ( (1403185451.0, 0), (1, 0)))
((0509420, 4827510), ((1403185449.0, 0), (1, 0)))
((7974923, 9235930), ((1403185450.0, 0), (1) , 0)))
((250259, 6876774), ((0, 1403185450.0), (0, 1)))
((642369, 6876774), ((0, 1403185450.0), (0, 1)))
((82628194 ) 、22251869)、((0、1403185452.0)、(0、1)))
((2162276、98056200)、((1403185451.0、0)、(1、0)))

しかし、実行中

lines.flatMap(myFunc) \
              .map(lambda x: (x[0], x[1])) \
              .reduceByKey(myFunc2)

エラーが表示されます

return (min(x1[0][0],x2[0][0]),max(x1[0][0],x2[0][0]),min(x1[0][1], x2[0][1]),max(x1[0][1],x2[0][1]),x1[1][0]+x2[1][0],x1[1][1 ]+x2[1][1])

TypeError: 'int' オブジェクトに属性 ' getitem 'がありません

私は自分のキーで何かを台無しにしていると思いますが、その理由はわかりません (ここで述べたようにキーをタプルに再キャストしようとしましたが、同じエラーが発生しました)

いくつかのアイデア?どうもありがとう

4

1 に答える 1

1

わかりました、ここでの問題は、あなたが考えているほど深くないアイテムにインデックスを付けすぎていることだと思います.

調べてみましょうmyFunc2

def myFunc2(x1,x2):
    return (min(x1[0][0],x2[0][0]),max(x1[0][0],x2[0][0]),min(x1[0][1],x2[0][1]),max(x1[0][1],x2[0][1]),x1[1][0]+x2[1][0],x1[1][1]+x2[1][1])

上記の質問を考えると、入力データは次のようになります。

((467401899, 485678002), ((1403185440.0, 0), (1, 0)))

先に進み、そのデータ行を変数に割り当てましょう。

x = ((467401899, 485678002), ((1403185440.0, 0), (1, 0)))

実行するとどうなりますx[0]か? を取得し(467401899, 485678002)ます。いつ実行しx[1]ますか?を取得し((1403185440.0, 0), (1, 0))ます。それがあなたのmap声明がしていることだと私は信じています。

わかった。それは明らかです。

関数myFunc2には、 と の 2 つのパラメーターがx1ありx2ます。これらは上記の変数に対応しますx1 = x[0] = (467401899, 485678002)x2 = x[1] = ((1403185440.0, 0), (1, 0))

return次に、関数内のステートメントの最初の部分だけを調べてみましょう。

min(x1[0][0], x2[0][0])

だから、x1 = (467401899, 485678002)。涼しい。さて、なにx1[0]?そうですね467401899。明らかに。ちょっと待って!なにx1[0][0]?のアイテムの 0 番目のインデックスを取得しようとしていますx1[0]が、 のアイテムはまたはではx1[0]なく、単なるです。のオブジェクトには と呼ばれるメソッドがありません。listtupleint<type 'int'>getitem

要約すると、それほど深くネストされていないオブジェクトを深く掘り下げています。に何を渡すmyFunc2か、およびオブジェクトの深さを慎重に検討してください。

return ステートメントの最初の部分は次のmyFunc2ようになるはずです。

return min(x1[0], x2[0][0]). より深くネストされたタプルがx2あるため、より深いインデックスを作成できます!x2


以下を実行すると、問題なく動作します。

a = sc.parallelize([((7401899, 5678002), ((1403185440.0, 0), (1, 0))),
((82628194, 22251869), ((0, 1403185452.0), (0, 1))),
((2162276, 98056200), ((1403185451.0, 0), (1, 0))),
((1509420, 4827510), ((1403185449.0, 0), (1, 0))),
((7974923, 9235930), ((1403185450.0, 0), (1, 0))),
((250259, 6876774), ((0, 1403185450.0), (0, 1))),
((642369, 6876774), ((0, 1403185450.0), (0, 1))),
((82628194, 22251869), ((0, 1403185452.0), (0, 1))),
((2162276, 98056200), ((1403185451.0, 0), (1, 0)))])

b = a.map(lambda x: (x[0], x[1])).reduceByKey(myFunc2)

b.collect()

[((1509420, 4827510), ((1403185449.0, 0), (1, 0))),
 ((2162276, 98056200), (1403185451.0, 1403185451.0, 0, 0, 2, 0)),
 ((7974923, 9235930), ((1403185450.0, 0), (1, 0))), 
 ((7401899, 5678002), ((1403185440.0, 0), (1, 0))), 
 ((642369, 6876774), ((0, 1403185450.0), (0, 1))), 
 ((82628194, 22251869), (0, 0, 1403185452.0, 1403185452.0, 0, 2)),
 ((250259, 6876774), ((0, 1403185450.0), (0, 1)))]
于 2016-05-09T18:52:45.450 に答える