编写调用scala中泛型函数的泛型函数

时间:2017-07-26 09:24:58

标签: scala generics apache-spark

我使用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 

1 个答案:

答案 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]
}