火花中的Encoders.product [scala特性] .schema

问题描述

如何从特征创建火花模式? 考虑特征:

trait A{
val name:String
val size:String
}

为:

Encoders.product[A].schema

给予:

Error:type arguments do not conform to method product's type parameter bounds [T <: Product]

字段数也将大于案例类参数的限制> 200

解决方法

Case类确实支持超过22列,请尝试在所有其他类/对象之外创建。如果您需要创建具有大量字段的数据框架构,则应该可以。

val schema: StructType = StructType(
    Array(
      StructField(name = "name",StringType),StructField(name = "size",StringType)
    )
 )
val data = Seq(Row("Ramanan","29"))
spark.createDataFrame(spark.sparkContext.parallelize(data),schema).show()
,

我无法向您提供所有详细信息,为什么它不起作用,但是我提出了一种在我们的Scala Spark项目中经常使用的替代解决方案。

Encoders.product的签名看起来像

product[T <: scala.Product](implicit evidence$5 : scala.reflect.runtime.universe.TypeTag[T])

这意味着tt需要一个扩展Product特征和隐式TypeTag的类。

当案例类自动扩展case class(和Product)时,您可以创建一个Serializable来代替特征。

为了获得模式,您可以执行以下操作:

case class A (
  val name: String,val size: String
)

def createSchema[T <: Product]()(implicit tag: scala.reflect.runtime.universe.TypeTag[T]) = Encoders.product[T].schema
val schema = createSchema[A]()
schema.printTreeString()

/*
root
 |-- name: string (nullable = true)
 |-- size: string (nullable = true)
*/

正如开始所说,我无法解释所有细节,只能提供一个可行的解决方案并希望它能满足您的需求。