Scala / Spark randomSplit

时间:2016-09-20 08:36:12

标签: scala intellij-idea apache-spark apache-spark-mllib

我正在尝试使用培训和测试数据制作模型。 我想控制参数: 1.如果我通过控制台获得一个参数(一个文件路径),我想分割数据。 2.如果我得到两个参数(两个文件路径),一个是训练,另一个是测试数据。 3.其他情况,默认情况下取一个。

问题是在条件之前定义变量。我不知道它是如何工作的Some / Option / None句子,我得到并在此之后出错了一些步骤:

var dataTraining: Option[RDD[String]]=None
var dataTesting: Option[RDD[String]]=None

if(args.length==1){
      val data=sc.textFile(args(0))
      val splitData=data.randomSplit(Array(0.8,0.2),seed=11L)
      (dataTraining,DataTesting)=(Some(splitData(0)),Some(splitData(1)))
}
else if(args.length==2){
      dataTraining=Some(sc.textFile(args(0))
      dataTesting=Some(sc.textFile(args(1))
}
else{
      dataTraining=Some(sc.textFile("/ruta")
      dataTesting=Some(sc.textFile("/ruta2")
}

我在这里没有收到任何错误,但是当我想尝试这样做:.map(_。split(','))时,intellij无法重新分配拆分功能。也许dataTraining / dataTesting的类型不正确。

¿我的错误是什么?

非常感谢!!

1 个答案:

答案 0 :(得分:0)

简单模式匹配怎么样:

def main(args: Array[String]) = {
  val (dataTraining, dataTesting) = args match {
    case Array(p) => 
       val splits = sc.textFile(p).randomSplit(Array(0.8,0.2),seed=11L)
       (splits(0), splits(1))

   case Array(p1, p2) => (sc.textFile(p1), sc.textFile(p2))

   case _ => (sc.textFile("/ruta"), sc.textFile("/ruta"))
  }
}

关于此问题,您最有可能仅将map应用于Option而不是RDD。你需要这样的东西:

val optionRdd: Option[RDD[String]] = ???

optionRdd.map(_.map(_.split(",")))

其中外map映射到Option,内层映射到RDD