2017-08-26 35 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],所以您的前两行不会编译 –