繁体   English   中英

Encoders.product中的TypeTag是什么?

[英]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来创建ProductEncoder (案例类),这就是为什么您需要在隐式上下文中加载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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM