当前位置: 首页 > 知识库问答 >
问题:

SPARK N-grams&不使用mapPartitions的并行化

慕容俭
2023-03-14

手头的问题写了一个尝试改进的双克生成器在行上工作,考虑到句号和类似的东西。结果如所愿。它不使用mapPartitions,但如下所示。

import org.apache.spark.mllib.rdd.RDDFunctions._

val wordsRdd = sc.textFile("/FileStore/tables/natew5kh1478347610918/NGram_File.txt",10)  
val wordsRDDTextSplit = wordsRdd.map(line => (line.trim.split(" "))).flatMap(x => x).map(x => (x.toLowerCase())).map(x => x.replaceAll(",{1,}","")).map(x => x.replaceAll("!
{1,}",".")).map(x => x.replaceAll("\\?{1,}",".")).map(x => x.replaceAll("\\.{1,}",".")).map(x => x.replaceAll("\\W+",".")).filter(_ != ".")filter(_ != "")  

val x = wordsRDDTextSplit.collect() // need to do this due to lazy evaluation etc. I think, need collect()
val y = for ( Array(a,b,_*) <- x.sliding(2).toArray) 
yield (a, b) 
  val z = y.filter(x => !(x._1 contains ".")).map(x => (x._1.replaceAll("\\.{1,}",""), x._2.replaceAll("\\.{1,}","")))

提前谢了。我一定是漏掉了一些基本的问题。

输出&结果z:Array[(String,String)]=Array((hello,how),(how,are),(are,you),(you,today),(i,am),(am,fine),(fine,but),(but,would),(wow,about),(about,the),(the,cat),(he,is),(is,not),(not,do),(do,wo),(show,we),(show,we),(show,we),(show,we),(show,we),(he.spark.rdd.rdd[String]=MapPartitionSrdd[669]位于mapPartitionsWithIndex位于:123

分区分配res13:Array[String]=Array(hello->0,how->0,are->0,you->0,today)。->0,i->0,am->32,fine->32,but->32,would->32,like->32,to->32,talk->60,to->60,you->60,about->60,the->60,cat。->60,他->60,是->60,不是->96,做->96,所以->96,嗯。->96,什么->96,应该->122,我们->122,做。->122,请->122,救命->122,我。->122,嗨->155,there->155,ged。->155)

可能火花只是真的很聪明,比我最初想象的要聪明。也可能不是?看到了一些关于分区保存的东西,其中一些自相矛盾。

map vs mapValues意味着前者破坏了分区,从而破坏了单个分区处理?

共有1个答案

太叔何平
2023-03-14

您可以使用mapPartitions on来代替任何用于创建wordsRDDTextSplit的映射,但我不认为有任何理由这样做。mapPartitions在初始化成本很高、不想为RDD中的每条记录付出代价时最有用。

无论使用map还是mapPartitions来创建wordsRDDTextSplit,在创建本地数据结构x之前,滑动窗口不会对任何内容进行操作。

 类似资料:
  • 在目前早期发布的名为高性能Spark的教科书中,Spark的开发人员注意到: 为了使Spark能够灵活地将一些记录溢出到磁盘上,在中表示函数是很重要的,这样函数就不会强制将整个分区加载到内存中(例如隐式转换为列表)。迭代器有许多方法,我们可以在上面编写函数样式转换,或者您可以构造自己的自定义迭代器。当一个转换直接获取并返回一个迭代器而不强制它通过另一个集合时,我们称之为迭代器到迭代器转换。 注意:

  • 我知道和之间的区别,它们分别针对元素和元素的迭代器。 我什么时候应该用哪个?如果开销是相似的,为什么我要使用,因为更容易编写?

  • 我试图运行Stanford-nlp分类器的20个新闻文本分类示例,使用n-gram(n=>1,2,3)作为特性,但我仍然出现内存错误。下面是我使用的属性和运行它的命令: 对于unigrams,程序按预期运行。问题是我只有4G内存可用,我想知道是否有可能加载像这样的大型号这样的内存这么少。 干杯,迪米特里斯

  • 假设我有+10000个句子,我想像这个例子一样分析。有可能并行处理这些和多线程吗?

  • 问题内容: 我有一堆JSON数组文件(准确地说是AVRO),每个文件都产生多个样本来训练Keras模型。通过使用@GPhilo和@jsimsa的想法,我能够想到这一点来并行化我的输入管道。无法弄清楚如何设计来划分处理文件的工作。代码内部失败,因为该函数需要一个字符串文件路径而不是一个, 这里正确的设计方法是什么 这是使用和设计输入管道的优化方法吗? 问题答案: 在我看来,发电机不必要地使您的生活变

  • 问题内容: 我有要并行处理的元素的集合。当我使用时,并行性有效。但是,当我使用时,它不会并行运行。 我写了一个代码样本来说明问题: 这是我在Windows 7上获得的输出 我们可以看到中的第一个元素必须在处理第二个元素之前完成。对于,第二个元素在第一个元素结束之前开始。 您能否告诉我是什么原因导致此问题,以及如何使用集合避免发生此问题? 问题答案: 我可以重现您看到的行为,其中并行性与您指定的fo