统计一行文本中每个单词出现的频率-Pyspark

Count the frequency of each word in a line of a text-Pyspark

我已经在 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就可以得到频率了

我找不到解决这个问题的方法。使用 aggregateByKeyreduceByKey 后我期望的输出是例如:在第 0 行中,单词 This 被使用了 1 次等...

[(0, ('This', 1, 'is', 1, 'the', 1, ...)), ...]

找出每行单词出现的次数并将它们组合在一起:

  1. 映射RDD中的元素,使得行号和单词成为键(即,),(0,('This',1))成为((0,'This' ), 1)
  2. 通过对出现的次数求和来减少第 1 步中的 RDD
  3. 重新映射第 2 步的结果,将行号作为键
  4. 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))]
"""