如何解决火花中的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)
*/
正如开始所说,我无法解释所有细节,只能提供一个可行的解决方案并希望它能满足您的需求。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。