模式匹配 - 火花scala RDD

时间:2015-12-02 09:18:24

标签: regex scala apache-spark pattern-matching rdd

我是来自R background的Spark和Scala的新手。经过一些RDD转换后,我得到了一个类型为

的RDD
Description: RDD[(String, Int)]

现在我想在String RDD上应用Regular表达式并从String中提取子字符串,并在新的coloumn中添加substring。

输入数据:

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是String 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
}

任何帮助将不胜感激!

由于

2 个答案:

答案 0 :(得分:4)

要将正则表达式应用于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)

但如果您根据需要更正了正则表达式,则可以将它们应用于每一行。

答案 1 :(得分:0)

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

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