Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/apache-spark/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python PySpark:计算单词对和单个单词_Python_Apache Spark_Pyspark - Fatal编程技术网

Python PySpark:计算单词对和单个单词

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("

我正在尝试使用PySpark进行一些基本的文本分析

为了解决这个问题,我将包含莎士比亚十四行诗的文本文件加载到RDD。输出应该是包含元组的RDD,如下所示:

(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连接两次,每次使用令牌对键的一个字。不确定这有多高效,但它是功能性的。