从案例类的完全限定名称中获取案例类的引用,用于将数据帧转换为数据集

问题描述 投票:0回答:1

我有案例类的完全限定名称。对于运行时的用例,我需要获取用于将数据帧转换为数据集的案例类的引用。 例如。

  • 我的 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)
dataframe scala apache-spark reflection dataset
1个回答
0
投票

您似乎正在尝试混合概念。 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]

会起作用的。

© www.soinside.com 2019 - 2024. All rights reserved.