[英]overloaded methods in Trait error Spark Scala
I have some code我有一些代码
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))
}
I'm getting an error at val rawData = reader.read(spark, "json", "/spark-test-data.json")
cannot resolve overloaded method read.我在
val rawData = reader.read(spark, "json", "/spark-test-data.json")
遇到错误,无法解析重载方法读取。
So I want to have Readers/Writers for different purposes LocalReader/S3Reader and since it can return DF and DS I write an overloaded method even I have to use one.所以我想拥有用于不同目的的读取器/写入器 LocalReader/S3Reader 并且因为它可以返回 DF 和 DS 我编写了一个重载方法,即使我必须使用一个。 And eventually, have to implement both.
最终,必须同时实施。 Any way to avoid it?
有什么办法可以避免吗?
How can I achieve what I'm trying to do?我怎样才能实现我想要做的事情? any other way or a better way etc?
任何其他方式或更好的方式等? how to fix the error?
如何修复错误?
Reason for getting cannot resolve overloaded method read.
获取的原因
cannot resolve overloaded method read.
is Reader trait has two methods both will take same number of params. is Reader trait 有两种方法都将采用相同数量的参数。
To solve this issue rename method names something like for example readDF & readDS
or you can also check below code & modify as per your requirement.要解决此问题,请重命名方法名称,例如
readDF & readDS
,或者您也可以检查以下代码并根据您的要求进行修改。
case class ReadConfig(format: String,path: String,options: Map[String,String])
case class WriteConfig(format: String,path: String,options: Map[String,String])
case class Config(read: ReadConfig,write: WriteConfig)
trait Writer {
def write(df: DataFrame): Unit
}
trait Reader {
def read: DataFrame
}
trait RW extends Reader with Writer {
val spark : SparkSession
val config : Config
}
// Add logic for Local
class Local(override val spark: SparkSession,override val config: Config) extends RW {
override def read: DataFrame = {
spark.read
.format(config.read.format)
.options(config.read.options)
.load(config.read.path)
}
override def write(df: DataFrame): Unit = {
df.write
.format(config.write.format)
.options(config.write.options)
.save(config.write.path)
}
}
// Add logic for S3
class S3(override val spark: SparkSession,override val config: Config) extends RW {
override def read: DataFrame = {
spark.read
.format(config.read.format)
.options(config.read.options)
.load(config.read.path)
}
override def write(df: DataFrame): Unit = {
df.write
.format(config.write.format)
.options(config.write.options)
.save(config.write.path)
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.