【问题标题】:Encoders.product[of a scala trait ].schema in sparkEncoders.product[of a scala trait ].schema in spark
【发布时间】:2021-01-24 08:27:43
【问题描述】:

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

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

【问题讨论】:

  • 制作扩展产品。
  • 如果字段数量有问题,您也可以将案例类嵌套到案例类中。

标签: scala apache-spark database-schema


【解决方案1】:

我无法向您详细说明为什么这不起作用,但我提出了一个我们在 Scala Spark 项目中经常使用的稍微替代的解决方案。

Encoders.product的签名长这样

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

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

您可以创建 case class 而不是 trait,因为案例类会自动扩展 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)
*/

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

【讨论】:

  • 谢谢@mike,但由于案例类的参数数量有一些限制,有没有办法获取大量字段的架构
  • 我们正在使用包含大约 200 个字段的案例类。不确定这是否是最佳解决方案,但 22 个字段的限制仅在 Scala 2.10.x 中,不再适用于 2.11。我们只需要在使用 Maven 编译时调整 JVM 参数:jvmArg&gt;-Xss2048K&lt;/jvmArg&gt;
  • 是的@mike,但实际上字段数超过 200
【解决方案2】:

案例类确实支持超过 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()

【讨论】:

    猜你喜欢
    • 2022-12-27
    • 1970-01-01
    • 2022-12-01
    • 2015-01-27
    • 2022-12-02
    • 2022-12-01
    • 2022-12-02
    • 2022-12-27
    • 2017-06-21
    相关资源
    最近更新 更多