Scala Spark中的隐式导入不起作用
我试图创建一个trait,将数据从配置单元表加载到类型化数据集中。代码如下: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
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")