使用Python的Spark:将RDD输出保存到文本文件中

6

我正在使用Python在Spark中尝试单词计数问题。但是,当我尝试使用.saveAsTextFile命令将输出RDD保存到文本文件时,遇到了问题。这是我的代码。请帮助我。我卡住了。感谢您的时间。

import re

from pyspark import SparkConf , SparkContext

def normalizewords(text):
    return re.compile(r'\W+',re.UNICODE).split(text.lower())

conf=SparkConf().setMaster("local[2]").setAppName("sorted result")
sc=SparkContext(conf=conf)

input=sc.textFile("file:///home/cloudera/PythonTask/sample.txt")

words=input.flatMap(normalizewords)

wordsCount=words.map(lambda x: (x,1)).reduceByKey(lambda x,y: x+y)

sortedwordsCount=wordsCount.map(lambda (x,y):(y,x)).sortByKey()

results=sortedwordsCount.collect()

for result in results:
    count=str(result[0])
    word=result[1].encode('ascii','ignore')

    if(word):
        print word +"\t\t"+ count

results.saveAsTextFile("/var/www/myoutput")

有什么问题吗?你能展示一下错误信息吗? - Alberto Bonsanto
请正确格式化您的问题,并突出显示代码。 - mgaido
追踪(Traceback)最近的调用如下: 文件“/home/cloudera/PythonTask/sorteddata.py”,第24行,在<module>中 results.saveAsTextFile("var/www/myoutput") 属性错误:'list'对象没有属性'saveAsTextFile'。 - RACHITA PATRO
尝试保存sortedwordsCount - WoodChopper
感谢大家的帮助。 - RACHITA PATRO
保存已排序的单词计数最终帮了我。 - RACHITA PATRO
2个回答

8

由于您收集了results=sortedwordsCount.collect(),所以它不是RDD。它将是普通的Python列表或元组。

正如您所知,list是Python对象/数据结构,append是添加元素的方法。

>>> x = []
>>> x.append(5)
>>> x
[5]

同样地,RDD是Spark的对象/数据结构,而saveAsTextFile是写文件的方法。重要的是它是分布式数据结构。
因此,我们不能在RDD上使用append或在列表上使用saveAsTextFilecollect是RDD上的方法,用于将RDD获取到驱动程序内存中。
如评论中所述,使用saveAsTextFile保存sortedwordsCount或在Python中打开文件并使用results将其写入文件中。

谢谢你的建议。那么请告诉我现在应该如何将结果存储到文本文件中。实际上,我对使用Python编程的Spark还不太熟悉,所以对此了解不多。 - RACHITA PATRO

1
results=sortedwordsCount.collect()更改为results=sortedwordsCount,因为使用.collect()会得到一个列表。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接