编码器,[scala特征的]积,spark中的模式

amrnrhlw  于 2021-05-24  发布在  Spark
关注(0)|答案(2)|浏览(506)

如何从一个特质为spark创建一个模式?考虑到一个特点:

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]

此外,字段的数量将超过case类参数>200的限制

x33g5p2x

x33g5p2x1#

我不能给你所有的细节,为什么这是不工作,但我提出了一个稍微替代的解决方案,我们经常使用在我们的scalaSpark项目。
签字人 Encoders.product 看起来像

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

这意味着tt需要一个 Product trait和一个隐式的typetag。
你可以创造一个 case class 随着case类的扩展 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)

* /

正如一开始所说,我不能解释所有的细节,只是提供一个有效的解决方案,并希望它符合您的需要。

relj7zay

relj7zay2#

case类不支持超过22列,请尝试在所有其他类/对象之外创建。如果您需要创建一个包含大量字段的dataframe模式,这应该是可行的。

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()

相关问题