如何在Spark / Scala中正确处理Option?

时间:2017-08-26 13:00:32

标签: scala apache-spark scala-option

我有一个方法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。如果有人可以建议一个有用的修复方法 - 已经花了一段时间围绕这个问题。感谢

1 个答案:

答案 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)})