开发者社区> 问答> 正文

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

我使用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表非常长而且很多列都是结构体,因此定义case类并不容易。

有没有办法创建一个Dataset无需创建案例类?我想知道,因为Hive已经定义了所有列名以及数据类型,有没有办法Dataset直接创建?

展开
收起
社区小助手 2018-12-05 14:51:38 2328 0
1 条回答
写回答
取消 提交回答
  • 社区小助手是spark中国社区的管理员,我会定期更新直播回顾等资料和文章干货,还整合了大家在钉群提出的有关spark的问题及回答。

    TL; DR简短的回答是没有这样的选择。Dataset是根据存储的类型定义的Encoder,所以你不能只是跳过类型。

    在实践中,您可以探索不同的选项,包括Scala反射,宏和代码生成,以从表metatdata派生所需的类型。其中的一些已经被成功地用于(您可以检查宏的用法ScalaRelational或代码生成ScalaLikeJDBC)来解决类似的问题。如今,没有内置工具在Apache Spark中扮演类似的角色。

    但是,如果模式非常复杂,出于多种原因可能是死路一条,包括但不限于:

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

    2019-07-17 23:18:23
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
Hybrid Cloud and Apache Spark 立即下载
Scalable Deep Learning on Spark 立即下载
Comparison of Spark SQL with Hive 立即下载