簡體   English   中英

為 Object 上的上下文邊界提供隱含證據

[英]Providing implicit evidence for context bounds on Object

我試圖在一些 Spark Scala 代碼中編寫一些抽象,但在使用對象時遇到了一些問題。 我在這里使用 Spark 的Encoder ,它用於將案例類轉換為數據庫模式,但我認為這個問題適用於任何上下文綁定

這是我正在嘗試做的最小代碼示例:

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.

我嘗試像這樣定義 object 中的隱式證據:(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

我嘗試的另一件事是將 object 轉換為 class 並向構造函數提供隱式證據:

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]

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM