我有一个方法createDataFrame,它返回一个Option [DataFrame]。然后我想“获取”DataFrame并在以后的代码中使用它。我遇到的类型不匹配是我无法修复的:
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为type:DataFrame,否则稍后代码将不会将df2识别为DataFrame,例如val Array(trainData, testData) = df2.randomSplit(Array(0.5,0.5),seed = 12345)
但是,case None
语句不是DataFrame类型,它返回Unit,因此不会编译。但是如果我没有声明df2的类型,则后面的代码将无法编译,因为它不被识别为DataFrame。如果有人可以建议一个有用的修复方法 - 已经花了一段时间围绕这个问题。感谢
答案 0 :(得分:1)
您需要的是地图。如果你映射到Option[T]
,你会做的事情是:“如果它是None
我什么都不做,否则我会将Option
的内容转换为其他内容。在你的情况下这是content是数据框本身。所以在这个myDFOpt.map()
函数中你可以放置你所有的数据帧转换,最后做你所做的模式匹配,如果你有None
,你可以打印一些东西。 / p>
编辑:
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)})