我使用Spark数据集读取csv文件。我想创建一个多态函数来为许多文件执行此操作。这是功能:
def loadFile[M](file: String):Dataset[M] = {
import spark.implicits._
val schema = Encoders.product[M].schema
spark.read
.option("header","false")
.schema(schema)
.csv(file)
.as[M]
}
我得到的错误是:
[error] <myfile>.scala:45: type arguments [M] do not conform to method product's type parameter bounds [T <: Product]
[error] val schema = Encoders.product[M].schema
[error] ^
[error] <myfile>.scala:50: Unable to find encoder for type stored in a Dataset. Primitive types (Int, String, etc) and Product types (case classes) are supported by importing spark.implicits._ Support for serializing other types will be added in future releases.
[error] .as[M]
[error] ^
[error] two errors found
我不知道如何处理第一个错误。我尝试添加与产品定义相同的差异(M&lt ;: Product),但后来我得到错误&#34;没有TypeTag可用于M&#34;
如果我传入已经从编码器生成的模式,那么我得到错误:
[error] Unable to find encoder for type stored in a Dataset
答案 0 :(得分:3)
您需要要求任何致电loadFile[M]
的人提供证据证明M
有这样的编码器。您可以使用M
上的上下文边界来执行此操作,这需要Encoder[M]
:
def loadFile[M : Encoder](file: String): Dataset[M] = {
import spark.implicits._
val schema = implicitly[Encoder[M]].schema
spark.read
.option("header","false")
.schema(schema)
.csv(file)
.as[M]
}