模式匹配 - 火花斯卡拉RDD

问题描述:

我新的火花和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

要在正则表达式应用到每个项目在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

嗨我只是在寻找其他问题,并得到了这个问题。上述问题可以使用正常转换来完成。

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