[英]Scala Spark Encoders.product[X] (where X is a case class) keeps giving me "No TypeTag available for X" error
[英]What is TypeTag in Encoders.product?
我使用Spark 2.1.1。
我從以下內容開始:
import org.apache.spark.sql.types._
val mySchema = StructType(
StructField("id", IntegerType, true),
StructField("code", StringType, false),
StructField("value", DecimalType, false))
val myDS = Seq((1,"000010", 1.0), (2, "000020", 2.0)).as[mySchema]
在這里,我看到mySchema不是類型,在查看了Encoders.scala
之后,我看到我需要通過此處傳遞Product的子類型
def product[T <: Product : TypeTag]: Encoder[T] = ExpressionEncoder()
因此,在從什么是Scala上下文邊界和視圖邊界看到冒號運算符只是隱式參數的語法糖之后? ,我可以看到應該有一個隱式TypeTag [T] ,但是我從SQLImplicits.scala
看,雖然我不理解TypeTag [T]是如何隱式的。
/**
* @since 1.6.1
* @deprecated use [[newSequenceEncoder]]
*/
def newProductSeqEncoder[A <: Product : TypeTag]: Encoder[Seq[A]] = ExpressionEncoder()
即使已棄用,當我看着
/** @since 2.2.0 */
implicit def newSequenceEncoder[T <: Seq[_] : TypeTag]: Encoder[T] = ExpressionEncoder()
我仍然想知道在哪里隱式聲明了TypeTag [T] ?
TypeTag
是一個類型類,它將為您嘗試TypeTag
任何類型隱式加載實例。 這獨立於Spark或SQLImplicits
,例如,您可以嘗試此
def getMyTypeTag[T : TypeTag]: TypeTag[T] = implicitly[TypeTag[T]]
另一方面,只要導入SqlImplicits
定義的隱式,就可以由spark構建spark sql Encoder
。如果查看LowPrioritySQLImplicits
您會發現需要TypeTag
來創建Product
的Encoder
(案例類),這就是為什么您需要在隱式上下文中加載TypeTag
trait LowPrioritySQLImplicits {
/** @since 1.6.0 */
implicit def newProductEncoder[T <: Product : TypeTag]: Encoder[T] = Encoders.product[T]
}
僅當您嘗試從中調用編碼器的代碼不是通用的或上下文中已經存在TypeTag時,才能調用TypeTag。 例如
def loadEncoder(): Encoder[MyType] ={
import spark.implicits._
Encoder[MyType] // The type is here so it will work
}
另一方面
loadEncoder[MyType]
def loadEncoder[T](): Encoder[T] ={
import spark.implicits._
Encoder[T] // The type info is not here so it wont work
}
和
loadEncoder[MyType]
def loadEncoder[T: TypeTag](): Encoder[T] ={
import spark.implicits._
Encoder[T] // The type info is not here but the TypeTag is so it will work
}
好的,我認為這是Spark的事情,但是頁面頂部有一個import語句
import scala.reflect.runtime.universe.TypeTag
當我查看API頁面http://www.scala-lang.org/api/2.11.6/scala-reflect/index.html#scala.reflect.api.TypeTags時 ,可以看到它在這里處理。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.