我是来自R background的Spark和Scala的新手。经过一些RDD转换后,我得到了一个类型为
的RDDDescription: 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
}
任何帮助将不胜感激!
由于
答案 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