簡體   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