【问题标题】:Modify a text file read by Spark修改 Spark 读取的文本文件
【发布时间】:2018-12-06 16:08:26
【问题描述】:

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

【问题讨论】:

    标签: python apache-spark pyspark


    【解决方案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 驱动程序,并违背了运行 分布式 处理框架的目的。

    【讨论】:

      猜你喜欢
      • 2012-02-27
      • 2019-11-12
      • 1970-01-01
      • 2019-02-08
      • 2013-07-25
      • 2021-07-10
      • 1970-01-01
      • 2017-05-19
      • 2015-12-19
      相关资源
      最近更新 更多