Python PySpark:计算单词对和单个单词
我正在尝试使用PySpark进行一些基本的文本分析 为了解决这个问题,我将包含莎士比亚十四行诗的文本文件加载到RDD。输出应该是包含元组的RDD,如下所示:Python PySpark:计算单词对和单个单词,python,apache-spark,pyspark,Python,Apache Spark,Pyspark,我正在尝试使用PySpark进行一些基本的文本分析 为了解决这个问题,我将包含莎士比亚十四行诗的文本文件加载到RDD。输出应该是包含元组的RDD,如下所示: (word_pair, count_of_word_pair, word_1_count, word_2_count) 其中,单词_1和单词_2是组成单词_对的单个单词 到目前为止,我能够正确生成一个RDD,其中包含单个唯一单词及其出现的行数计数,另一个RDD包含单词对(顺序问题)和计数: distFile = sc.textFile("
(word_pair, count_of_word_pair, word_1_count, word_2_count)
其中,单词_1和单词_2是组成单词_对的单个单词
到目前为止,我能够正确生成一个RDD,其中包含单个唯一单词及其出现的行数计数,另一个RDD包含单词对(顺序问题)和计数:
distFile = sc.textFile("Shakespeare.txt")
tokens = (
distFile.map(simple_tokenize)
.flatMap(set)
.map(lambda x: (x, 1))
.reduceByKey(lambda x, y: x + y)
)
token_pairs = (
distFile.map(simple_tokenize)
.flatMap(lambda x: itertools.permutations(x, 2))
.filter(lambda x: x[0] != x[1])
.map(lambda x: (x, 1))
.reduceByKey(lambda x, y: x + y)
注意:simple_tokenize是一个函数,它将所有字符设置为小写,并将每行上的句子拆分为单词列表
样本输出如下:
令牌的前10个元素:
('shakespeare', 38),
('we', 3125),
('fairest', 42),
('increase', 28),
('creatures', 38),
('die', 461),
('rose', 68),
("beauty's", 30),
('thereby', 26),
('never', 996)]
令牌对的前10个元素:
[('the', 'sonnets', 2),
('sonnets', 'the', 2),
('by', 'william', 39),
('william', 'by', 39),
('from', 'desire', 4),
('fairest', 'creatures', 1),
('fairest', 'we', 1),
('fairest', 'increase', 1),
('creatures', 'fairest', 1),
('creatures', 'we', 4)],
我很困惑,我不知道如何在同一个RDD中组合这些不同的计数(根据所需的输出)。据我所知,我无法在map函数内部的rdd之间执行任何类型的键循环(或者,除非我收集其中一个,否则我根本无法执行)。这是正确的吗
如何在不必将任何内容存储为Python中的局部变量的情况下获得所需的输出?您能否发布您生成的每个RDD的输出示例?为了给你一个详细的答案?(理想情况下,您希望组合两个输出)想法是将两个RDD映射为具有相似的键,然后在两个RDD之间应用连接运算符以组合它们。通过您生成的输出示例,我将能够给您提供更详细的答案。@AhlamAIS我已更新原始问题,以包含示例数据。谢谢。@AhlamAIS我目前的解决方案是简单地将令牌对和令牌RDD连接两次,每次使用令牌对键的一个字。不确定这有多高效,但它是功能性的。