[英]more efficient method in Spark than filter.count?
我有一個任務,我在 Spark 中有一個 rdd,其記錄如下所示:
[(id, group), {'token1', 'token2'...}]
例如 '''tokenizedTweetsByUser.take(5)''' 提供:
[(('470520068', 3), {'#berniesanders', '#goldmansachs', '$', '.', '/', '4', 'a', 'adorned', 'bc', 'capitalist', 'class', "doesn't", 'he', "i'm", 'pig', 'ride', 'rigged', 'system', 'voting', 'w', 'war'}), (('2176120173', 6), {'!', '#america', '#trump', '#votetrump', '&', '.', ':', ';', '@realdonaldtrump', '@trumpnewmedia', 'amp', 'change', "don't", 'get', 'htt', 'if', "it's", 'nothing', 'out', 'rt', 'simple', 'that', 'will', 'you', '…'}), (('145087572', 3), {'!', '#colorado', '#denver', '%', ',', '-', '.', '1', '11am', '1pm', ':', '@allonmedicare', '@berniesanders', '@libertea2012', '@rockportbasset', 'america', 'and', 'capitol', 'co', 'endorse', 'for', 'herself', 'hillary', 'http', 'icymi', 'in', 'is', 'leading', 'liar', 'mst', 'only', 'out', 'positive', 'progressive', 'proof', 'rt', 's', 'state', 'that', 'the', 'to', 'today', 'voices', 'wake-up', 'weasel', '’', '…'}), (('23047147', 6), {'@madworldnews', '[', ']', 'after', 'bernie', 'deal', 'fans', 'had', 'liberal', 'pour', 'supporter', 'tears', 'to', 'trump', 'via', 'vid', 'with'}), (('526506000', 4), {'.', ':', '@justinamash', '@tedcruz', 'calls', 'candidate', 'cartel', 'correctly', 'he', 'i', 'is', 'on', 'only', 'remaining', 'rt', 'take', 'the', 'to', 'trust', 'washington', 'what', '…'})]
令牌來自推文和前 100 個令牌的列表,我需要計算為每個組找到的每個令牌的數量。 有8組。
我的實現很簡單:
tokenizedTweetsByUser.cache()
groupCounts = []
for i in range(8):
groupCounts.append([])
for token in tokensList:
#the following statement take too long!
item_count = tokenizedTweetsByUser.filter(lambda x: (x[0][1] == i) and (token in x[1])).count()
if item_count > 0:
groupCounts[i].append((token, item_count))
但這需要很長時間。 我知道 filter.count 將運行 800 次,但由於它只是一個過濾器計數,我們正在尋找一組我希望性能相當好的令牌。
有人可以建議另一種更高效的方法嗎?
看起來reduceByKey 比在filter.count 的多個實例上循環要有效得多。
在這種情況下,將組和列表項組合成一個字符串,該字符串將成為鍵,以便每個列表項都是單獨的行。 然后執行reduceByKey:
tokenizedTweetsByUser.flatMapValues(lambda x: x).map(lambda x: (str(x[0][1])+" "+str(x[1]), 1)).reduceByKey(lambda x, y: x + y)
數量級快了幾倍。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.