![](/img/trans.png)
[英]How to groupy and count the occurances of each element of an array column in Pyspark
[英]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.