【问题标题】:How to count pattern occurrence in a file using pyspark如何使用pyspark计算文件中出现的模式
【发布时间】:2016-01-21 17:18:17
【问题描述】:

我有两个文件。一个有普通数据的大的,一个有分行模式的。

如何使用 map reduce 算法计算大文件中出现的所有模式,特别是在使用 python (pyspark) 的 Apache Spark 引擎中。

数据文件:

ABCDEFABCDERFADACCABCDEABA.....

模式文件:

ABC
BCF
CDE

【问题讨论】:

  • 我是 Spark 的新手,我刚刚阅读了示例。 PattenFile 最多有 100 条记录,
  • DataFile 怎么样?已经分裂了吗?
  • 不,这是一个大文件(1GB)

标签: apache-spark mapreduce pyspark


【解决方案1】:

如果你的PattenFile 很小(意味着适合你的主人,假设你正在使用集群),我只会告诉你你需要什么的要点,我希望你完成它。请注意,我假设您已经将DataFile 中的数据拆分为三重奏。

  1. 加载两个文件。

    data = sc.textFile("DataFile")
    pattern = sc.textFile("PatternFile")
    
  2. 广播字典(patternFile),如你所说,够小了。

    dictionary = pattern.collect()
    broadcast_dictionary = sc.broadcast(dictionary) 
    
  3. 过滤您的data

    data = data.filter(lambda x: x in dictionary.value)
    

【讨论】:

    【解决方案2】:

    作为@Alberto Bonsanto 解决方案的补充,您可以通过以下方式将数据拆分为三组。不幸的是 pyspark 似乎没有提供sliding 方法。手动编码是相当麻烦的。

    dat0=flatMap(lambda x:list(x))
            .zipWithIndex()
            .filter(lambda (_,i): i>=0)
            .groupBy(lambda (_,i): i/3).values()
            .map(lambda x: 
              reduce(lambda y1,y2: 
                y1+''+y2,map(lambda (u,_):u,list(x))
               )
             )
    

    此外,您还需要创建类似物dat1dat2,其中filter(lambda (_,i): i>=0)filter(lambda (_,i): i>=1)filter(lambda (_,i): i>=2) 替换,以便将可能的偏移考虑在内。

    【讨论】:

      猜你喜欢
      • 2014-04-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-23
      • 1970-01-01
      • 1970-01-01
      • 2021-12-22
      • 1970-01-01
      相关资源
      最近更新 更多