如何正确处理Spark/Scala中的Option?
How to correctly handle Option in Spark/Scala?
我有一个方法,createDataFrame,它 returns 一个 Option[DataFrame]。然后我想 'get' 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 的类型为:DataFrame 否则以后的代码将无法将 df2 识别为 DataFrame,例如val Array(trainData, testData) = df2.randomSplit(Array(0.5,0.5),seed = 12345)
但是,case None
语句不是 DataFrame 类型,它是 returns 单元,因此无法编译。但是如果我不声明 df2 的类型,后面的代码将无法编译,因为它不被识别为 DataFrame。如果有人可以提出一个有用的修复建议 - 一段时间以来一直在绕圈子。谢谢
你需要的是一张地图。如果你映射一个 Option[T]
你正在做这样的事情:“如果它是 None
我什么都不做,否则我将 Option
的内容转换成其他东西。在你的情况下这个content 是数据框本身。所以在这个 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)})
我有一个方法,createDataFrame,它 returns 一个 Option[DataFrame]。然后我想 'get' 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 的类型为:DataFrame 否则以后的代码将无法将 df2 识别为 DataFrame,例如val Array(trainData, testData) = df2.randomSplit(Array(0.5,0.5),seed = 12345)
但是,case None
语句不是 DataFrame 类型,它是 returns 单元,因此无法编译。但是如果我不声明 df2 的类型,后面的代码将无法编译,因为它不被识别为 DataFrame。如果有人可以提出一个有用的修复建议 - 一段时间以来一直在绕圈子。谢谢
你需要的是一张地图。如果你映射一个 Option[T]
你正在做这样的事情:“如果它是 None
我什么都不做,否则我将 Option
的内容转换成其他东西。在你的情况下这个content 是数据框本身。所以在这个 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)})