2017-08-26 34 views
2

我有一個createDataFrame方法,它返回一個Option [DataFrame]。然後我想'獲取'DataFrame並在後面的代碼中使用它。我得到一個類型不匹配,我無法修復:如何正確處理Spark/Scala中的選項?

val df2: DataFrame = createDataFrame("filename.txt") match { 
    case Some(df) => { //proceed with pipeline 
     df.filter($"activityLabel" > 0) 
    case None => println("could not create dataframe") 
} 

val Array(trainData, testData) = df2.randomSplit(Array(0.5,0.5),seed = 12345) 

我需要DF2爲類型:數據幀不然以後的代碼將無法識別DF2的數據幀例如val Array(trainData, testData) = df2.randomSplit(Array(0.5,0.5),seed = 12345)
但是,case None語句不是DataFrame類型,它返回Unit,所以不會編譯。但是如果我不聲明df2的類型,那麼後面的代碼將不會被編譯,因爲它不會被識別爲DataFrame。如果有人可以提出一個有用的解決方案 - 一段時間以來一直圍繞着這個問題進行討論。謝謝

回答

1

你需要的是一張地圖。如果你通過Option[T]進行映射,你就是這樣做的:「如果它是None我什麼都不做,否則我將Option的內容轉換成其他的東西。在你的情況下,這個內容就是數據框本身,所以在這個myDFOpt.map()函數中你可以把你所有的數據幀轉型,只是做到底的模式匹配你這樣做,在這裏,如果你有一個None你可以打印的東西

編輯:

val df2: DataFrame = createDataFrame("filename.txt").map(df=>{ 
val filteredDF=df.filter($"activityLabel" > 0) 

val Array(trainData, testData) = filteredDF.randomSplit(Array(0.5,0.5),seed = 12345)}) 
+0

謝謝回答@Chobeat你能告訴。我什麼意思請請用一些示例代碼?謝謝! – LucieCBurgess

+0

我添加了一個小樣本,但目前我沒有時間驗證是的。不過,它應該清楚我的意思。 – Chobeat

+0

選項[A]上的地圖會再次給您選項[A],所以您的前兩行不會編譯 –