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 有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

df.sqlContext.sql() 不识别数据库表

未找到 Spark SQL 包

SqlContext 错误?

spark dataFrame withColumn

Spark Cassandra 连接器:SQLContext.read + SQLContext.write 与手动解析和插入(JSON -> Cassandra)

spark怎么实现将mysql表中按照字段的优先级关联起来