谁能告诉我为什么我们有两种不同的方式来表示竖线(| )和逗号(,)。喜欢
sc.textFile(file).map( x => x.split(","))
对于逗号,和
sc.textFile(file).map( x => x.split('|'))
对于管道。
将两者都放在双引号中,它的竖线和逗号失败给了我正确的结果。
下面是我正在运行的完整代码
package com.rakesh.singh
import org.apache.spark._
import org.apache.spark.SparkContext._
import org.apache.log4j._
object MPMovie {
def namex ( x : String) = {
val fields = x.split('|')
val id = fields(0).toInt
val name = fields(1).toString
(id , name)
}
def main(rakesh : Array[String]) = {
Logger.getLogger("yoyo").setLevel(Level.ERROR)
val conf = new SparkConf().setAppName("Movies").setMaster("local[2]")
val sc = new SparkContext(conf)
val rdd = sc.textFile("F:/Raakesh/ml-100k/movies.data")
val names = sc.textFile("F:/Raakesh/ml-100k/names.data")
val mappednames = names.map(namex)
val splited = rdd.map(x => (x.split("\t")(1).toInt,1))
//.map(x => (x,1))
val counteachmovie = splited.reduceByKey( (a ,b )=> a + b).map( x => (x._2 , x._1))
val mpm = counteachmovie.max()
println(s"the final value of mpm is $mpm")
mappednames.foreach(println)
val finalname = mappednames.lookup(mpm._2)(0)
println(s"the final value of mpm is $finalname")
}
}
和数据文件是
movies.data 196 101 3 881250949 186 101 3 891717742 22 103 1 878887116 244 102 2 880606923
姓名:Data 101|Sajan 102|Mela 103|Hum
发布于 2018-02-26 14:27:21
有两种不同的split
方法:
split(",")
方法最初来自String.split(regex: String),它使用任意正则表达式作为分隔符,例如
scala> "helloABCworldCABfooBBACCAbar".split("[ABC]+")
res0: Array[String] = Array(hello, world, foo, bar)
另一个split('|')
来自StringOps.split(separator: Char),它更像是一个通用的Scala集合操作。它不适用于正则表达式,但它适用于所有StringLike
集合,例如StringBuilder
s:
scala> val b = new StringBuilder
b: StringBuilder =
scala> b ++= "hello|"
res2: b.type = hello|
scala> b ++= "world"
res3: b.type = hello|world
scala> b.split('|')
res4: Array[String] = Array(hello, world)
"|“不适用于第一种方法,因为它是一个无意义的"OR"-regex。为了在split(regex: String)
版本中使用管道|
,您必须像这样对它进行转义,或者(通常更容易)将它封装到"[|]"
-character类中。
https://stackoverflow.com/questions/48990661
复制