繁体   English   中英

SPARK N元语法和并行化未使用mapPartitions

[英]SPARK N-grams & Parallelization not using mapPartitions

眼前的问题编写了一种尝试的改进的二元语法生成器,该生成器在线路上工作,同时考虑了句号等。 结果是想要的。 它不使用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,}","")))

我有一些疑问:

  1. 结果是预期的。 没有数据丢失。 但是我可以将这种方法转换为mapPartitions方法吗? 我不会丢失一些数据吗? 许多人说是这种情况,这是由于要处理的分区具有所有单词的子集,因此缺少了拆分边界(即下一个和上一个单词)的关系。 对于较大的文件拆分,我可以从地图的角度看到这也可能发生。 正确?

  2. 但是,如果您查看上面的代码(没有mapPartitions尝试),则无论我并行化了多少,它始终可以工作,其中10或100用分区连续指定的单词指定。 我用mapPartitionsWithIndex进行了检查。 我不清楚。 好的,对(x,y)=> x + y的约简是很容易理解的。

提前致谢。 我必须在所有这些方面中缺少一些基本要点。

输出和结果 z:Array [(String,String)] = Array((hello,how),(how,are),(are,you),(you,today),(i,am),(am,fine ),(很好,但是),(但是,会),(会,喜欢),(喜欢,到),(去,说话),(会说话,到),(到,你),(你,关于), (关于),(猫),(他是),(不是),(不做),(正在做),(如此),(应该),(应该) ,we),(we,do),(please,help),(help,me),(hi,there),(there,ged))映射:org.apache.spark.rdd.RDD [String] = MapPartitionsRDD [669]在mapPartitionsWithIndex处:123

分区分配 res13:Array [String] = Array(你好-> 0,如何-> 0,是-> 0,你-> 0,今天。-> 0,i-> 0,am-> 32,很好-> 32,但-> 32,会-> 32,例如-> 32,到-> 32,通话-> 60,到-> 60,您-> 60,大约-> 60,-> 60,猫- > 60,他-> 60,是-> 60,不是-> 96,正在执行-> 96,所以-> 96,很好-> 96,什么-> 96,应该-> 122,我们-> 122, -> 122,请-> 122,帮助-> 122,我-> 122,嗨-> 155,那里-> 155,年龄-> 155)

可能是SPARK真的很聪明,比我最初想象的要聪明。 或者可能不是? 在分区保存方面看到了一些东西,其中有些矛盾。

map vs mapValues意味着前者破坏了分区,因此破坏了单个分区?

您可以使用mapPartitions代替用于创建wordRDDTextSplit的任何地图,但是我真的看不出有任何理由。 当您不想为RDD中的每条记录支付高昂的初始化费用时, mapPartitions最为有用。

无论您使用map还是mapPartitions创建wordRDDTextSplit ,您的滑动窗口都不会对任何操作,除非您创建本地数据结构x

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM