簡體   English   中英

如何減少列列表中列值的出現次數?

[英]How can I reduceByKey count occurances of column value in column list?

我有一個RDD用戶

 userID, movieID, list of movieIDs
[(69120, (296, [296, 356, 2858, 608, 588, 1580, 597, 153, 4306, 587]))],...

我希望計算第二列值在第三列列表中的次數。

userMovies.reduceByKey(lambda v : 1 if v[1][0] in v[1][1] else 0).take(1)

我嘗試通過reduceByKey加1或0來獲得RDD,然后將總RDD值相加,就像所有1的總和一樣。 但是reduceByKey返回相同的RDD且不給出1或0。

編輯:

userMovies.map(lambda tup: (tup[0], (tup[1][0], 1 if tup[1][0] in tup[1][1] else 0))).reduceByKey(lambda a,b: a[1][1]+b[1][1]).take(2)

退貨

[(43450, (84152, 0)), (60830, (345, 0))]

我只需要一個行列[(totalsum)]而不是每個鍵

您是否嘗試僅使用Counter()?

from collections import Counter

a = [(69120, (296, [296, 356, 2858, 608, 588, 1580, 597, 153, 4306, 587]))]
k = a[0][1][0]
i = a[0][1][1]
r = Counter(i)[k] #occurrences of k in i also i.count(k) would be ok.

>>> print(k, r)
296 1

如果將RDD映射到第二個元組元素,則應該可以通過以下鍵進行縮減:

rdd = sc.parallelize([(69120, (296, \
        [296, 356, 2858, 608, 588, 1580, 597, 153, 4306, 587]))])

rdd = rdd.map(lambda tup: (tup[0], (tup[1][0], 1 if tup[1][0] in tup[1][1] else 0)))

這將保持相同的元組結構,但用其中出現的電影ID的數目替換電影列表:

dd.collect()

該代碼輸出:

[(69120, (296, 1))]

(userID, (movieID, 1 if found else 0))

如果您需要計算每個電影的觀看總數(針對所有用戶):

rdd.map(lambda l: l[1])\
   .reduceByKey(lambda a,b: a+b)\
   .collect()

使用此收藏集,單個電影的結果將相似:

[(296, 1)]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM