Scala Spark中的隐式导入不起作用

Scala Spark中的隐式导入不起作用,scala,maven,apache-spark,apache-spark-sql,implicit,Scala,Maven,Apache Spark,Apache Spark Sql,Implicit,我试图创建一个trait,将数据从配置单元表加载到类型化数据集中。代码如下: import org.apache.spark.sql.{Dataset, Row, SparkSession} trait PartitionedHiveTableLoader[T] { def context: String def table: String def returnEntity: Row => T def load(sparkSession: SparkSession, to

我试图创建一个trait,将数据从配置单元表加载到类型化数据集中。代码如下:

import org.apache.spark.sql.{Dataset, Row, SparkSession}

trait PartitionedHiveTableLoader[T] {
  def context: String
  def table: String
  def returnEntity: Row => T
  def load(sparkSession: SparkSession, token: String): Dataset[T] = {
    import sparkSession.implicits._
    sparkSession.sql(s"SELECT * from $context.$table where d = $token").
      map(returnEntity(_))
  }
  def load(sparkSession: SparkSession, lowBound: String, upperBound: String, includeLow: Boolean = true, includeUpper: Boolean = true): Dataset[T] = {
    import sparkSession.implicits._
    sparkSession.sql(s"SELECT * " +
      s"from $context.$table " +
      s"where d >${if(includeLow)"=" else ""} $lowBound " +
      s"and d<${if(includeUpper)"=" else ""} $upperBound").
      map(returnEntity(_))
  }
}
但是当我用mvn包编译它时,我有以下错误:

错误:找不到数据集中存储的类型的编码器。导入spark.implicits支持基元类型(Int、String等)和产品类型(case类)。在将来的版本中将添加对序列化其他类型的支持

但我在每种方法中都引入了spark.implicits。。。
有人知道问题出在哪里吗?

类型
T
的隐式
编码器必须在编译时为您使用的方法提供

导入
import sparkSession.implicits.\u
时,实际上为许多已知的常见类型(例如字符串、长字符串、数组、大小写类等)导入了一组内置编码器,但是-
T
未知的未绑定的,因此它可以是任何类型,并且没有任何类具有内置编码器-因此此导入没有用处

要解决此问题,应向方法签名添加隐式编码器参数:

def load(sparkSession: SparkSession, token: String)(implicit enc: Encoder[T]): Dataset[T] = {
  sparkSession.sql(s"SELECT * from $context.$table where d = $token").
    map(returnEntity(_))
}

def load(sparkSession: SparkSession,
         lowBound: String,
         upperBound: String,
         includeLow: Boolean = true,
         includeUpper: Boolean = true)(implicit enc: Encoder[T]): Dataset[T] = {
  sparkSession.sql(s"SELECT * " +
    s"from $context.$table " +
    s"where d >${if(includeLow)"=" else ""} $lowBound " +
    s"and d<${if(includeUpper)"=" else ""} $upperBound").
    map(returnEntity(_))
}

请提供
FreeUsersRightsDataset
定义。无法判断问题是否出在没有它的情况下,作用域本身就是类。实际上,问题恰恰是
FreeUserRightsDataset
,spark不知道如何序列化这种类型。它是否实现了可序列化的
接口?这应该足以让它工作,尽管Java序列化并不是最有效的
def load(sparkSession: SparkSession, token: String)(implicit enc: Encoder[T]): Dataset[T] = {
  sparkSession.sql(s"SELECT * from $context.$table where d = $token").
    map(returnEntity(_))
}

def load(sparkSession: SparkSession,
         lowBound: String,
         upperBound: String,
         includeLow: Boolean = true,
         includeUpper: Boolean = true)(implicit enc: Encoder[T]): Dataset[T] = {
  sparkSession.sql(s"SELECT * " +
    s"from $context.$table " +
    s"where d >${if(includeLow)"=" else ""} $lowBound " +
    s"and d<${if(includeUpper)"=" else ""} $upperBound").
    map(returnEntity(_))
}
import spark.implicits._

FreeUsersRightsLoader.load(spark, "token")