Apache spark Spark—从配置单元读取数据并创建一个不带case类的强类型数据集

Apache spark Spark—从配置单元读取数据并创建一个不带case类的强类型数据集,apache-spark,apache-spark-sql,apache-spark-dataset,Apache Spark,Apache Spark Sql,Apache Spark Dataset,我使用spark从配置单元表读取数据,我真正想要的是一个强类型的数据集 以下是我正在做的,这是有效的: val myDF=spark.sql(“从配置单元数据库配置单元表中选择col1、col2”) //确保case类中的字段名与配置单元列名完全匹配 案例类MyCaseClass(col1:String,col2:String) val myDS=myDF.as[myCaseClass] 我的问题是,我的配置单元表很长,而且许多列都是结构,因此定义case类并不简单 有没有一种方法可以创建数据

我使用spark从配置单元表读取数据,我真正想要的是一个强类型的
数据集

以下是我正在做的,这是有效的:

val myDF=spark.sql(“从配置单元数据库配置单元表中选择col1、col2”)
//确保case类中的字段名与配置单元列名完全匹配
案例类MyCaseClass(col1:String,col2:String)
val myDS=myDF.as[myCaseClass]
我的问题是,我的配置单元表很长,而且许多列都是结构,因此定义case类并不简单


有没有一种方法可以创建
数据集
,而无需创建case类?我想知道,既然Hive已经定义了所有的列名和数据类型,有没有办法直接创建一个
数据集;DR简单的回答是没有这样的选择
Dataset
是根据存储的类型定义的,它是
Encoder
,所以不能只跳过类型

实际上,您可以探索不同的选项,包括Scala反射、宏和代码生成,以从表metatdata派生所需的类型。其中一些已在野外成功使用(您可以在中检查宏使用情况或在中检查代码生成),以解决类似问题。正如今天一样,在ApacheSpark中没有类似的内置工具

然而,如果模式非常复杂,那么它可能是一条死胡同,原因有很多,包括但不限于:

  • “类型化”转换的定义
  • 平台限制,如JVM方法的参数数量限制(参见示例)或JVM代码大小限制
  • 可用性,尤其是使用Scala反射时。虽然代码生成可以提供相当不错的用户体验,但剩下的选项可以说并不比使用简单命名的
    Any
    (也称为a.a
    o.a.s.sql.Row
    )更好