如何正确处理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)})