[英]Using PySpark to Count Number of Occurrences
我有一個 PairedRDD,其中包含文檔 ID 作為鍵,以及該文檔中的單詞列表作為值。 例如
文檔ID | 字 |
---|---|
001 | [“快速”,“棕色”,“狐狸”,“懶惰”,“狐狸”] |
002 | [“香蕉”、“蘋果”、“蘋果”、“香蕉”、“狐狸”] |
我設法做了一個mapValues,這樣:
文檔ID | 字 |
---|---|
001 | [("快",1),("棕色",1),("狐狸",1),("懶惰",1),("狐狸",1)] |
002 | [("香蕉",1),("蘋果",1),("蘋果",1),("香蕉",1),("狐狸",1)] |
有沒有辦法只對單詞做一個 ReduceByKey() ?
文檔ID | 字 |
---|---|
001 | [("quick",1),("brown",1),("fox",2),("lazy",1)] |
002 | [("香蕉",2),("蘋果",2),("狐狸",1)] |
我仍然需要維護結構,以便僅在每個文檔中應用計數。
您可以使用collections.Counter
來計算每個文檔中的單詞數:
from collections import Counter
rdd = sc.parallelize([
("001", ["quick","brown","fox","lazy","fox"]),
("002", ["banana","apple","apple","banana","fox"])
])
counted = rdd.mapValues(lambda x: list(zip(Counter(x).keys(), Counter(x).values())))
counted.collect()
# [('001', [('quick', 1), ('brown', 1), ('fox', 2), ('lazy', 1)]),
# ('002', [('banana', 2), ('apple', 2), ('fox', 1)])]
另一種 RDD 唯一方法:
from operator import add
result = rdd.flatMapValues(lambda x: x) \
.map(lambda x: (x,1)) \
.reduceByKey(add) \
.map(lambda x: (x[0][0], [(x[0][1], x[1])])) \
.reduceByKey(add)
result.collect()
#[('002', [('banana', 2), ('apple', 2), ('fox', 1)]),
# ('001', [('brown', 1), ('fox', 2), ('lazy', 1), ('quick', 1)])]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.