我有案例类的完全限定名称。对于运行时的用例,我需要获取用于将数据帧转换为数据集的案例类的引用。 例如。
我的 FQN 为:
com.org.common.Field
我想做一些类似的事情
dataframe.as[Field]
但是这个参考不起作用。
我做过类似的事情
val df = Seq(
("1", "2")
).toDF("name", "dataType")
val fqn: String = "com.org.common.Field$"
val clazz = Class.forName(fqn)
val typedDf = df.as(Encoders.bean(clazz))
typedDf.show()
typedDf.printSchema()
输出是
+----+--------+
|name|dataType|
+----+--------+
| 1| 2|
+----+--------+
root
|-- name: string (nullable = true)
|-- dataType: string (nullable = true)
案例类别是
case class Field(name: String, dataType: Int)
您似乎正在尝试混合概念。 Bean 编码器完全使用 java bean 反射标准来创建/读取类。产品编码器用于案例类别。
请参阅此处:Apache Spark 文档 - 创建数据集了解其工作原理。
您的字段类型具有 Int 数据类型,但您的 Seq 具有字符串:
import spark.implicits._ // or whatever your session variable name is
val ds = Seq(Field("1",2)).toDS
ds.show
ds.printSchema
使用正确类型的 Seq,导入将允许基于 Field 派生 toDS 和编码器。如果您已经有一个具有正确类型的 DataFrame (Dataset[Row]),那么:
import spark.implicits._
val df = Seq(
("1", 2)
).toDF("name", "dataType")
val ds = df.as[Field]
会起作用的。