2016-09-20 81 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