2016-09-20 85 views
0

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

问题是在条件之前定义变量。我不知道它是如何工作的一些/选项/无一句,我得到后此错误一些步骤:

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的类型不正确。

¿我的错误是什么?

非常感谢你!

回答

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