首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >spark-scala中竖线和逗号分隔符的区别

spark-scala中竖线和逗号分隔符的区别
EN

Stack Overflow用户
提问于 2018-02-26 22:22:39
回答 1查看 663关注 0票数 1

谁能告诉我为什么我们有两种不同的方式来表示竖线(| )和逗号(,)。喜欢

代码语言:javascript
代码运行次数:0
运行
复制
sc.textFile(file).map( x => x.split(","))

对于逗号,和

代码语言:javascript
代码运行次数:0
运行
复制
sc.textFile(file).map( x => x.split('|')) 

对于管道。

将两者都放在双引号中,它的竖线和逗号失败给了我正确的结果。

下面是我正在运行的完整代码

代码语言:javascript
代码运行次数:0
运行
复制
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

EN

回答 1

Stack Overflow用户

发布于 2018-02-26 22:27:21

有两种不同的split方法:

split(",")方法最初来自String.split(regex: String),它使用任意正则表达式作为分隔符,例如

代码语言:javascript
代码运行次数:0
运行
复制
scala> "helloABCworldCABfooBBACCAbar".split("[ABC]+")
res0: Array[String] = Array(hello, world, foo, bar)

另一个split('|')来自StringOps.split(separator: Char),它更像是一个通用的Scala集合操作。它不适用于正则表达式,但它适用于所有StringLike集合,例如StringBuilders:

代码语言:javascript
代码运行次数:0
运行
复制
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类中。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48990661

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档