我正在使用spark从Hive表中读取数据,而我真正想要的是强类型Dataset
这就是我正在做的事情,并且有效:
val myDF = spark.sql("select col1, col2 from hive_db.hive_table")
// Make sure that the field names in the case class exactly match the hive column names
case class MyCaseClass (col1: String, col2: String)
val myDS = myDF.as[myCaseClass]
我遇到的问题是我的Hive表很长,并且许多列都是结构,因此定义案例类并非易事
是否有一种无需创建案例类即可创建Dataset
的方法?我想知道既然Hive已经定义了所有列名以及数据类型,是否有办法直接创建Dataset
?
答案 0 :(得分:3)
TL; DR 简短的答案是没有这种选择。 Dataset
是根据存储类型定义的,它是Encoder
,因此您不能只跳过类型。
实际上,您可以探索不同的选项,包括Scala反射,宏和代码生成,以从表元数据派生所需的类型。其中一些已在野外成功使用(您可以在ScalaRelational中检查宏使用情况,或者在ScalaLikeJDBC中检查代码生成)来解决类似的问题。到今天为止,还没有内置工具在Apache Spark中扮演类似的角色。
但是,如果架构非常复杂,由于多种原因,它可能会死胡同,包括但不限于:
Any
包(又称o.a.s.sql.Row
)命名包好。