Spark-从Hive读取并创建没有案例类的强类型数据集

时间:2018-11-27 17:20:06

标签: apache-spark apache-spark-sql apache-spark-dataset

我正在使用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

1 个答案:

答案 0 :(得分:3)

TL; DR 简短的答案是没有这种选择。 Dataset是根据存储类型定义的,它是Encoder,因此您不能只跳过类型。

实际上,您可以探索不同的选项,包括Scala反射,宏和代码生成,以从表元数据派生所需的类型。其中一些已在野外成功使用(您可以在ScalaRelational中检查宏使用情况,或者在ScalaLikeJDBC中检查代码生成)来解决类似的问题。到今天为止,还没有内置工具在Apache Spark中扮演类似的角色。

但是,如果架构非常复杂,由于多种原因,它可能会死胡同,包括但不限于:

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