【发布时间】:2020-05-18 15:28:16
【问题描述】:
我有一些代码
trait Reader {
def read(spark: SparkSession, format: String, path: String): DataFrame
def read[T: Encoder](spark: SparkSession, format: String, path: String): Dataset[T]
}
class LocalReader extends Reader {
override def read[T: Encoder](spark: SparkSession, format: String, path: String): Dataset[T] = {
spark.read
.format(format)
.option("header", "true")
.load(getClass.getResource(path).getPath)
.as[T]
}
override def read(spark: SparkSession, format: String, path: String): DataFrame = {
spark.read
.format(format)
.option("header", "true")
.load(getClass.getResource(path).getPath)
}
}
object TopNSimilarCustomers extends SparkJob {
override def appName: String = "TopNSimilarCustomers"
override def run(spark: SparkSession, args: Array[String], reader: Reader): Unit = {
/**
* Only I/O here
*/
if (args.length == 0)
return
val rawData = reader.read(spark, "json", "/spark-test-data.json")
val res = transform(spark, rawData, args(0))
}
val rawData = reader.read(spark, "json", "/spark-test-data.json") 出现错误,无法解析重载方法读取。
所以我想拥有用于不同目的的 Readers/Writers LocalReader/S3Reader,因为它可以返回 DF 和 DS,所以我编写了一个重载方法,即使我必须使用一个。最终,必须同时实施。有什么办法可以避免吗?
我怎样才能实现我想要做的事情?任何其他方式或更好的方式等? 如何修复错误?
【问题讨论】:
-
您只给它 2 个参数,而它还需要一个
SparkSession对象。另外,您为什么不直接重命名您的方法,而不是让其中两个具有相同的签名? -
抱歉,错字,已更新。它仍然给出相同的错误
-
尝试将您的 2 个读取方法重命名为
readDataFrame和readDataSet之类的名称 -
trait 中不需要两个签名相同的方法,执行两次即可
-
@Sam,实际上,他们这样做了。类型参数不算
标签: java scala apache-spark overloading