簡體   English   中英

使用 PySpark 統計出現次數

[英]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.

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