我试图在使用Spark时计算Hadoop集群中几个文本文件中的单词数。我设法获取了字数,但我还想做一些进一步的修改,例如忽略数字或将所有字词转换为小写。我无法正常遍历RDD数据。我试过使用collect(),但是map函数不接受list作为参数。我也尝试过将正则表达式逻辑直接应用于RDD的“过滤器”功能,但没有成功。这是我到目前为止提出的代码,无需我注释掉的部分即可使用。
from pyspark import SparkConf, SparkContext
import re
conf = SparkConf().setAppName("Word count")
sc = SparkContext(conf=conf)
sc.setLogLevel("WARN")
text = sc.textFile("/data/book/*.txt") \
.flatMap(lambda line: line.split())
#handledText = text.map(lambda s: s.replace("\d", "", text))
counts = text.map(lambda word: (word, 1)) \
.groupByKey() \
.map(lambda p: (p[0], sum(p[1])))
res = counts.takeOrdered(text.count(), key=lambda p: -p[1])
print(res)
答案 0 :(得分:1)
text.map(lambda s: s.replace("\d", "", text))
您将Python中的map()
内建函数与Spark的DataFrame.map()
混淆了……不,text
参数在那里无效。
尝试一下
def lower_no_digit(word):
return lower(word.replace(r'\d+', ''))
counts = text.map(lower_no_digit) \
.filter(lambda w : len(w) > 0) \
.map(lambda word: (word, 1)) \
在应用(word, 1)
旁边-在SparkSQL中执行相同的操作比较简单,不需要手动放置(word, 1)
我尝试使用collect()
请勿map(lambda x : ... , df.collect())
。这会将所有数据带到本地Spark驱动程序,并破坏了运行分布式处理框架的目的。