[英]Pattern matching - spark scala RDD
我是R背景的Spark和Scala的新手,在對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
其中Brand和Series是來自字符串RDD的新計算的子字符串
到目前為止我所做的。
我可以使用正則表達式為String實現此功能,但是我可以將其應用於所有行。
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
}
任何幫助,將不勝感激 !
謝謝
要將正則表達式應用於RDD中的每個項目,您應該使用RDD map
函數,該函數使用某些函數(在本例中為Partial Function來提取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)
但是,如果您根據需要更正了正則表達式,這就是將它們應用於每行的方法。
您好,我只是在尋找另一個問題,並得到了這個問題。 可以使用正態轉換來完成上述問題。
val a=sc.parallelize(collection)
a.map{case (x,y)=>(x.split (" ")(0)+" "+x.split(" ")(1))}.collect
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.