计算文本行中每个单词出现的频率-Pyspark
Posted
技术标签:
【中文标题】计算文本行中每个单词出现的频率-Pyspark【英文标题】:Count the frequency of each word in a line of a text-Pyspark 【发布时间】:2021-12-31 01:33:45 【问题描述】:我在 PySpark 中用这个表单创建了一个 rdd:
[(0, ('This', 1)), (0, ('is', 1)), (0, ('the', 1)), (0, ('100th', 1)), (0, ('Etext', 1)), (0, ('file', 1)), (0, ('presented', 1)), (0, ('by', 1)), (0, ('Project', 1)), (0, ('Gutenberg,', 1)), (0, ('and', 1)), (1, ('is', 1)), (1, ('presented', 1)), (1, ('in', 1)), (1, ('cooperation', 1)), (1, ('with', 1)), (1, ('World', 1)), (1, ('Library,', 1)), (1, ('Inc.,', 1)), (1, ('from', 1))]
对于第一个项目this
位于第一个row(0)
。我加了1就可以得到频率了。
我找不到解决此问题的方法。使用aggregateByKey
或reduceByKey
后我期望的输出是例如:在第0 行,单词This
被使用了1 次等等......
[(0, ('This', 1, 'is', 1, 'the', 1, ...)), ...]
【问题讨论】:
【参考方案1】:找出每行单词出现的次数并将它们组合在一起:
-
映射RDD中的元素,使得行号和单词成为键(即,),(0,('This',1))变成((0,'This'),1)李>
通过对第 1 步中出现的次数求和来减少 RDD
重新映射第 2 步的结果以将行号作为键
ReduceByKey 组合(单词,总行数)的元组
rdd = spark.sparkContext.parallelize([(0, ('a', 1)), (0, ('b', 1)), (0, ('a', 1)), (1, ('a', 1))])
occurences_per_line = rdd.map(lambda x: ((x[0], x[1][0]), x[1][1])).reduceByKey(lambda x, y: x + y)
occurences_per_line.map(lambda x: (x[0][0], (x[0][1], x[1]))).reduceByKey(lambda x, y: x + y).collect()
"""
[(0, ('a', 2, 'b', 1)), (1, ('a', 1))]
"""
【讨论】:
以上是关于计算文本行中每个单词出现的频率-Pyspark的主要内容,如果未能解决你的问题,请参考以下文章