修改Spark读取的文本文件

时间:2018-12-06 16:08:26

标签: python apache-spark pyspark

我试图在使用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)

1 个答案:

答案 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驱动程序,并破坏了运行分布式处理框架的目的。