Apache Spark SQLContext 与 HiveContext 有啥区别?
Posted
技术标签:
【中文标题】Apache Spark SQLContext 与 HiveContext 有啥区别?【英文标题】:What is the difference between Apache Spark SQLContext vs HiveContext?Apache Spark SQLContext 与 HiveContext 有什么区别? 【发布时间】:2015-11-12 07:49:10 【问题描述】:Apache Spark SQLContext 和 HiveContext 有什么区别?
一些消息来源说,由于 HiveContext 是 SQLContext 的超集,因此开发人员应始终使用具有比 SQLContext 更多功能的 HiveContext。但目前每个上下文的 API 大多是相同的。
SQLContext/HiveContext 更有用的场景有哪些? HiveContext 是否仅在使用 Hive 时更有用? SQLContext 是否就是使用 Apache Spark 实现大数据应用程序所需的全部?【问题讨论】:
【参考方案1】:Spark 2.0+
Spark 2.0 提供本机窗口函数 (SPARK-8641),并在解析方面进行了一些额外的改进,并具有更好的 SQL 2003 合规性,因此它对 Hive 实现核心功能的依赖显着减少,因此 HiveContext
(SparkSession
在 Hive 支持下)似乎不太重要。
火花
显然,如果您想使用 Hive,您必须使用 HiveContext
。除此之外,目前 (Spark 1.5) 的最大区别是支持 window functions 和访问 Hive UDF 的能力。
一般来说,窗口函数是一个非常酷的特性,可以用来以简洁的方式解决相当复杂的问题,而无需在 RDD 和 DataFrame 之间来回切换。性能仍远未达到最佳状态,尤其是在没有 PARTITION BY
子句的情况下,但它确实与 Spark 无关。
关于 Hive UDF,现在这不是一个严重的问题,但在 Spark 1.5 之前,许多 SQL 函数已经使用 Hive UDF 表达并且需要HiveContext
才能工作。
HiveContext
还提供了更强大的 SQL 解析器。例如:py4j.protocol.Py4JJavaError when selecting nested column in dataframe using select statetment
最后HiveContext
是启动 Thrift 服务器所必需的。
HiveContext
最大的问题是它的依赖关系很大。
【讨论】:
从您的评论看来,HiveContext 唯一的缺点是它的依赖关系很大。除此之外,始终使用 HiveContext 而不是 SqlContext 是否安全。我正在运行 SparkR 1.6 环境。 来自jaceklaskowski.gitbooks.io/mastering-apache-spark/content/… "SparkSession 已在 Spark 2.0 中将 SQLContext 和 HiveContext 合并到一个对象中。" 在工程上下文中,最重要的是要考虑包含“enableHiveSupport()”将使用配置单元 JAR 启动本地 thrift 服务器(通常在端口 10000 上),该服务器将使用以下方式与 metastoreDB 通信hive-site.xml 中的 javax 连接参数。【参考方案2】:当针对 Spark SQL 进行编程时,我们有两个入口点,具体取决于 我们是否需要 Hive 支持。推荐的入口点是 HiveContext 提供对 HiveQL 和其他 Hive 相关功能的访问。更基础的 SQLContext 提供了 Spark SQL 支持的一个子集,它不依赖于 蜂巢。
-对于可能与包含所有内容有冲突的用户存在分隔 Hive 依赖项。
-SQLContext 中没有的 HiveContext 的其他功能包括使用更完整的 HiveQL 解析器编写查询的能力、对 Hive UDF 的访问以及从 Hive 表中读取数据的能力。
-使用 HiveContext 不需要现有的 Hive 设置。
【讨论】:
更多阅读请参考spark.apache.org/docs/1.6.1/sql-programming-guide.html 即使是 sql 上下文也不需要 hive 设置【参考方案3】:HiveContext 仍然是 sqlcontext 的超集,它包含一些额外的属性,例如它可以从 hive-site.xml 读取配置,以防你有 hive 使用,否则只需使用 sqlcontext
【讨论】:
能否使用 swlContext 设置 hive.exec.dynamic.partition=true 等 hive 属性?以上是关于Apache Spark SQLContext 与 HiveContext 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章
Spark Cassandra 连接器:SQLContext.read + SQLContext.write 与手动解析和插入(JSON -> Cassandra)