我写了一种从S3读取文件的方法。如果文件存在,则返回一个DataFrame,否则将引发异常。我收到编译器错误:Expression of type Unit doesn't conform to expected type DataFrame
。
据我了解,这是由在else分支中引发异常的逻辑引起的。 我现在看到的唯一选项是返回默认值,而不是引发异常。但是该方法必须返回一个DataFrame。也许我应该以某种方式使用期权?
对于这种情况下如何实现返回DataFrame的任何建议,我将不胜感激。
import java.nio.file.{Paths, Files}
def loadMetricsData(dataPath: String, metricsData: String): DataFrame = {
if (Files.exists(Paths.get(s"$dataPath/$metricsData.json"))) {
val metricsDataDF: DataFrame =
spark.read.option("multiline", "true").json(s"$dataPath/$metricsData.json")
metricsDataDF
} else throw new IllegalArgumentException("File doesn't exist")
}
UPD:if块中有一个错字,没有返回metricsDataDF,它只包含一个赋值。
答案 0 :(得分:0)
您在方法中返回的是类型为“ Unit”的对象,而不是“ DataFrame”。在“ if”语句中,已为变量分配了方法调用的结果。在Scala中,赋值语句返回一个Unit。
您可以返回结果变量,如下所示:
def loadMetricsData1(spark: SparkSession, dataPath: String, metricsData: String): DataFrame = {
val res = if(Files.exists(Paths.get(s"$dataPath/$metricsData.json"))) {
spark.read.option("multiline", "true").json(s"$dataPath/$metricsData.json")
} else throw new IllegalArgumentException("File doesn't exist")
println("output is: " + res)
res
}
或者简单地说,您可以避免将结果分配给这样的变量:
import java.nio.file.{Paths, Files}
def loadMetricsData(dataPath: String, metricsData: String): DataFrame = {
if(Files.exists(Paths.get(s"$dataPath/$metricsData.json"))) {
spark.read.option("multiline", "true")
.json(s"$dataPath/$metricsData.json")
} else throw new IllegalArgumentException("File doesn't exist")
}