0
Iterableオブジェクト内で可能なすべての組み合わせを見つけたいと思います。グループごとにすべての組み合わせを見つけるPySpark
[(('DrDre', 'Plane and a Disaster'), (11.0, 14.0, 1.0, 2.0)),
(('DrDre', 'Tikk Takk Tikk'), (1.0, 3.5)),
(('DrDre', 'Tennis Dope'), (11.0, 45.0, 1.0, 5.0)),
(('Plane and a Disaster', 'Tikk Takk Tikk'), (2.0, 3.5)),
(('Plane and a Disaster', 'Tennis Dope'), (14.0, 45.0, 2.0, 5.0)),
(('Tikk Takk Tikk', 'Tennis Dope'), (3.5, 45.0)),
(('DrDre', 'Just My Luck'), (11.0, 2.0)),
(('Plane and a Disaster', 'Just My Luck'), (14.0, 2.0)),
(('Just My Luck', 'Tennis Dope'), (2.0, 45.0))]
これが私の最後の右の組み合わせを与えるものではありません、私の現在のコードです:
私の入力が予想される出力はこのようなものになるだろう
Object1|DrDre|1.0
Object1|Plane and a Disaster|2.0
Object1|Tikk Takk Tikk|3.5
Object1|Tennis Dope|5.0
Object2|DrDre|11.0
Object2|Plane and a Disaster|14.0
Object2|Just My Luck|2.0
Object2|Tennis Dope|45.0
です。
def iterate(iterable):
r = []
for v1_iterable in iterable:
for v2 in v1_iterable:
r.append(v2)
return tuple(r)
def parseVector(line):
'''
Parse each line of the specified data file, assuming a "|" delimiter.
Converts each rating to a float
'''
line = line.split("|")
return line[0],(line[1],float(line[2]))
def FindPairs(object_id,items_with_usage):
'''
For each objects, find all item-item pairs combos. (i.e. items with the same user)
'''
for item1,item2 in combinations(items_with_usage,2):
return (item1[0],item2[0]),(item1[1],item2[1])
'''
Obtain the sparse object-item matrix:
user_id -> [(object_id_1, rating_1),
[(object_id_2, rating_2),
...]
'''
object_item_pairs = lines.map(parseVector).groupByKey().map(
lambda p: sampleInteractions(p[0],p[1],500)).cache()
'''
Get all item-item pair combos:
(item1,item2) -> [(item1_rating,item2_rating),
(item1_rating,item2_rating),
...]
'''
pairwise_objects = object_item_pairs.filter(
lambda p: len(p[1]) > 1).map(
lambda p: findItemPairs(p[0],p[1])).groupByKey()
x = pairwise_objects.mapValues(iterate)
x.collect()
これは最初のペアのみを返します。
[(( 'DrDre'、 '面および障害')、(11.0、14.0、1.0、2.0))]
Iの組み合わせ()関数の機能を誤解しましたか?私はあなたがこのよう
def FindPairs(object_id,items_with_usage):
'''
For each objects, find all item-item pairs combos. (i.e. items with the same user)
'''
t = []
for item1,item2 in combinations(items_with_usage,2):
t.append(((item1[0],item2[0]),(item1[1],item2[1])))
return t
であなたのFindPairsを変換することができると思い、あなたの入力
あなたは_for_ループの中に 'return'コマンドを入れます。つまり、ループは最初のサイクルで終了します。それで、最初の組だけを持っている理由は、 'combination(items_with_usage、2)'のすべての要素を格納していないため、最初の項目の組を返すことです。 – titiro89
ああ、ありがとうtitiro89 !! :) – ponthu