使用Python的文件中的单词频率

使用Python的文件中的单词频率,python,pyspark,word-count,Python,Pyspark,Word Count,我正在尝试使用python程序计算字数 from pyspark import SparkContext sc = SparkContext(appName="Words") lines = sc.textFile(sys.argv[1], 1) counts=dict() words = lines.split(" ") for word in words: if word in counts: counts[word] += 1 else:

我正在尝试使用python程序计算字数

from pyspark import SparkContext

sc = SparkContext(appName="Words")
lines = sc.textFile(sys.argv[1], 1)
counts=dict()
words = lines.split(" ")
for word in words:
    if word in counts:
        counts[word] += 1
    else:
        counts[word] = 1

output = counts.collect()
for (word, count) in output:
    print "%s: %i" % (word, count)

sc.stop()

这并没有给我想要的输出。这段代码有什么改进吗?

看起来你把python和spark混为一谈了

当您使用读取文件时,将得到字符串的RDD。从a到a引用我自己的话:

您要执行的所有操作都在RDD的内容上, 文件的元素。在RDD上调用
split()
因为
split()
是一个字符串函数。你想做什么 而是调用
split()
和对每条记录(行)的其他操作 在RDD的文件中)。这正是
map()
所做的

下面是如何使用pySpark修改代码以计算单词频率

首先,我们将把每行中的每个单词
w
映射成
(w,1)
形式的元组。然后我们将调用
reduceByKey()
,并为每个单词添加计数

例如,如果该行是
“快速棕色狐狸跳过懒狗”
,则映射步骤会将该行变成:

[('The',1),('quick',1),('brown',1),('fox',1),('jumps',1),('over',1),
('the',1),('lazy',1),('dog',1)]
由于这将返回一个元组列表,因此我们将调用,以便将每个元组视为唯一的记录。这里需要考虑的另一件事是,您是否希望计数区分大小写,以及是否需要删除任何标点符号或特殊字符

flatMap()
之后,我们可以调用它,它使用相同的键(在本例中为单词)收集所有元组,并对值应用reduce函数(在本例中为
operator.add()

从pyspark导入SparkContext
从操作员导入添加
sc=SparkContext(appName=“Words”)
lines=sc.textFile(sys.argv[1],1)#这是一个RDD
#counts是一个rdd,其形式为(word,count)
counts=lines.flatMap(λx:[(w.lower(),1)表示x.split()中的w])。reduceByKey(add)
#collect将其带到本地内存中的列表中
输出=计数。收集()
对于输出中的(字、计数):
打印“%s:%i”%(字,计数)
sc.stop()#停止spark上下文

看起来你把python和spark混为一谈了

当您使用读取文件时,将得到字符串的RDD。从a到a引用我自己的话:

您要执行的所有操作都在RDD的内容上, 文件的元素。在RDD上调用
split()
因为
split()
是一个字符串函数。你想做什么 而是调用
split()
和对每条记录(行)的其他操作 在RDD的文件中)。这正是
map()
所做的

下面是如何使用pySpark修改代码以计算单词频率

首先,我们将把每行中的每个单词
w
映射成
(w,1)
形式的元组。然后我们将调用
reduceByKey()
,并为每个单词添加计数

例如,如果该行是
“快速棕色狐狸跳过懒狗”
,则映射步骤会将该行变成:

[('The',1),('quick',1),('brown',1),('fox',1),('jumps',1),('over',1),
('the',1),('lazy',1),('dog',1)]
由于这将返回一个元组列表,因此我们将调用,以便将每个元组视为唯一的记录。这里需要考虑的另一件事是,您是否希望计数区分大小写,以及是否需要删除任何标点符号或特殊字符

flatMap()
之后,我们可以调用它,它使用相同的键(在本例中为单词)收集所有元组,并对值应用reduce函数(在本例中为
operator.add()

从pyspark导入SparkContext
从操作员导入添加
sc=SparkContext(appName=“Words”)
lines=sc.textFile(sys.argv[1],1)#这是一个RDD
#counts是一个rdd,其形式为(word,count)
counts=lines.flatMap(λx:[(w.lower(),1)表示x.split()中的w])。reduceByKey(add)
#collect将其带到本地内存中的列表中
输出=计数。收集()
对于输出中的(字、计数):
打印“%s:%i”%(字,计数)
sc.stop()#停止spark上下文

请在您的问题中包括所需和实际的输出。您的问题不是关于python的,它似乎是一个Pypark问题。当您执行
words=lines.split(“”
)时,您应该会遇到语法错误。
dict
没有
collect
方法。请在问题中包含所需的和实际的输出。您的问题不是关于python的-它似乎是一个Pypark问题。执行
words=lines.split(“”
)操作时应该会出现语法错误。
dict
没有
collect
方法。