scala - 为 Object 的上下文边界提供隐式证据

标签 scala apache-spark generics implicit

我试图在一些 Spark Scala 代码中编写一些抽象,但在使用对象时遇到了一些问题。我正在使用 Spark 的 Encoder 将案例类转换为数据库模式作为示例,但我认为这个问题适用于任何 context bound .

这是我正在尝试执行的操作的最小代码示例:

package com.sample.myexample

import org.apache.spark.sql.Encoder
import scala.reflect.runtime.universe.TypeTag

case class MySparkSchema(id: String, value: Double)

abstract class MyTrait[T: TypeTag: Encoder]

object MyObject extends MyTrait[MySparkSchema]

失败并出现以下编译错误:

Unable to find encoder for type com.sample.myexample.MySparkSchema. An implicit Encoder[com.sample.myexample.MySparkSchema] is needed to store com.sample.myexample.MySparkSchema instances 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.

我试过这样定义对象中的隐含证据:(IntelliJ 建议使用 import 语句,但看起来有点奇怪)

import com.sample.myexample.MyObject.encoder

object MyObject extends MyTrait[MySparkSchema] {
  implicit val encoder: Encoder[MySparkSchema] = Encoders.product[MySparkSchema]
}

失败并显示错误消息

MyTrait.scala:13:25: super constructor cannot be passed a self reference unless parameter is declared by-name

我尝试的另一件事是将对象转换为类并向构造函数提供隐式证据:

class MyObject(implicit evidence: Encoder[MySparkSchema]) extends MyTrait[MySparkSchema]

这可以编译并正常工作,但代价是 MyObject 现在变成了一个 class

问题:是否可以在扩展特征时为上下文边界提供隐式证据?还是隐含的证据迫使我创建构造函数并改用 class

最佳答案

您的第一个错误几乎为您提供了解决方案,您必须为产品类型导入 spark.implicits._

你可以这样做:

val spark: SparkSession = SparkSession.builder().getOrCreate()
import spark.implicits._

完整示例

package com.sample.myexample

import org.apache.spark.sql.Encoder
import scala.reflect.runtime.universe.TypeTag

case class MySparkSchema(id: String, value: Double)

abstract class MyTrait[T: TypeTag: Encoder]

val spark: SparkSession = SparkSession.builder().getOrCreate()
import spark.implicits._

object MyObject extends MyTrait[MySparkSchema]

关于scala - 为 Object 的上下文边界提供隐式证据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71065854/

相关文章:

python - 如何在客户端模式下使用 pyspark 和 spark standalone 加载 --jars

apache-spark - Spark 作业在 jackson 依赖项上失败

c - 如何使用通用 void 指针将值扫描到数组中?

scala - 我们是否应该像在训练前并行化 Seq 一样并行化 DataFrame

json - scala json4s 我如何按条件提取字段

scala - Scala 中不可变值的可变字段

java - 如何将泛型列表类作为参数传递给 Java 中的泛型方法?

Scala:使用反射来发现你的内在对象(和欲望)?

apache-spark - 如何在 Spark SQL 中创建数据库

Scala 泛型 : How to declare that a type must be a case class?