我试图创建通用的DataSet [T]阅读器,以避免每个阅读器调用都使用dataframe.as [..]。对原始类型和案例类的支持,所以我在想类似的东西:
def read[T <: Product](sql : String): Dataset[T] = {
import sparkSession.implicits._
val sqlContext = sparkSession.sqlContext
val df: DataFrame = sqlContext.read.option("query", sql).load()
df.as[T]
}
Run Code Online (Sandbox Code Playgroud)
但是我收到“无法为数据集中存储的类型找到编码器”错误。可以做这样的事情吗?
第二周期:
def read[T <: Product](sql : String) : Dataset[T] = {
import sparkSession.implicits._
innerRead(sql)
}
private def innerRead[T <: Product : Encoder](sql : String): Dataset[T] = {
val sqlContext = sparkSession.sqlContext
val df: DataFrame = sqlContext.read.option("query", sql).load()
df.as[T]
}
Run Code Online (Sandbox Code Playgroud)
以类型不匹配结尾(foudn Encoder [Nothing],必需的Encoder [T])。
我试图仅导入newProductEncoder,但结果相同。