2015-12-02 93 views
1

我新的火花和Scala來自R background.After未來RDD的幾個轉變,我得到類型的RDD模式匹配 - 火花斯卡拉RDD

Description: RDD[(String, Int)] 

現在我想申請一個正則表達式字符串RDD並從字符串中提取子字符串,並在新顏色中添加子字符串。

輸入數據:

BMW 1er Model,278 
MINI Cooper Model,248 

輸出我要找:

Input     | Brand | Series  
BMW 1er Model,278,   BMW ,  1er   
MINI Cooper Model ,248  MINI ,  Cooper 

,其中品牌和系列新近從字符串RDD

計算子我迄今所做的。

我可以使用正則表達式來實現此字符串,但我可以應用所有行。

val brandRegEx = """^.*[Bb][Mm][Ww]+|.[Mm][Ii][Nn][Ii]+.*$""".r //to look for BMW or MINI 

那麼我可以用

brandRegEx.findFirstIn("hello this mini is bmW testing") 

但我怎麼可以用它RDD的所有行,並應用不同的正則表達式來實現如上的輸出。

我閱讀了這段代碼片段,但不知道如何完全放它。

val brandRegEx = """^.*[Bb][Mm][Ww]+|.[Mm][Ii][Nn][Ii]+.*$""".r 

def getBrand(Col4: String) : String = Col4 match { 
    case brandRegEx(str) => 
    case _ => "" 
    return 'substring 
} 

任何幫助,將不勝感激!

感謝

+1

可以詳細說明這裏究竟是什麼問題?正則表達式,模式匹配還是RDD轉換? – zero323

+0

@ zero323:對不起,如果問題不可讀。基本上我想使用正則表達式在字符串中進行模式匹配。這是在Spark-scala RDD中。 – user3560220

回答

3

要在正則表達式應用到每個項目在RDD,爲了提取你應該使用RDD map功能,使用一些功能(在這種情況下,其將每一行的RDD,部分功能要彌補了每一行的元組的兩個部分):

import org.apache.spark.{SparkContext, SparkConf} 

object Example extends App { 

    val sc = new SparkContext(new SparkConf().setMaster("local").setAppName("Example")) 

    val data = Seq(
    ("BMW 1er Model",278), 
    ("MINI Cooper Model",248)) 

    val dataRDD = sc.parallelize(data) 

    val processedRDD = dataRDD.map{ 
    case (inString, inInt) => 
     val brandRegEx = """^.*[Bb][Mm][Ww]+|.[Mm][Ii][Nn][Ii]+.*$""".r 
     val brand = brandRegEx.findFirstIn(inString) 
     //val seriesRegEx = ... 
     //val series = seriesRegEx.findFirstIn(inString) 
     val series = "foo" 
     (inString, inInt, brand, series) 
    } 

    processedRDD.collect().foreach(println) 
    sc.stop() 
} 

請注意,我認爲你必須在你的正則表達式的一些問題,還需要尋找該系列中的正則表達式。這段代碼輸出:

(BMW 1er Model,278,BMW,foo) 
(MINI Cooper Model,248,NOT FOUND,foo) 

但是,如果你糾正你的正則表達式爲你的需求,這是你如何將它們應用到每一行。

+0

感謝您的快速回復。我也以同樣的方式接近。我看到我的正則表達式不正確。我會嘗試糾正它並在此處發佈我的解決方案。 – user3560220

+0

使用'findFirstIn(inString)'我不能得到我需要的子字符串。例如:如果我的輸入字符串是** Model BMW 5series **。 'findFirstIn(inString)'也給我返回前綴「Model BMW」。你能告訴我使用哪個函數嗎?findFirstIn絕對不會給出正確的子字符串 – user3560220

+0

看看我的示例代碼,它確實提取了子字符串,例如「寶馬」。另外請注意,「寶馬模型」實際上是一個子串,而不是你想要的子串。問題在於你的正則表達式不夠具體。 – mattinbits

0

嗨我只是在尋找其他問題,並得到了這個問題。上述問題可以使用正常轉換來完成。

val a=sc.parallelize(collection) 
a.map{case (x,y)=>(x.split (" ")(0)+" "+x.split(" ")(1))}.collect