Apache Spark SQLContext和HiveContext有什么区别?

47

Apache Spark SQLContext和HiveContext有什么区别?

一些资料称,由于HiveContext是SQLContext的超集,开发人员应始终使用具有比SQLContext更多功能的HiveContext。但目前每个上下文的API大部分相同。

  • 在哪些场景下使用SQLContext/HiveContext更加有用?
  • 仅在使用Hive时HiveContext更有用吗?
  • 或者,只使用SQLContext在实现Apache Spark大数据应用程序时就足够了吗?
3个回答

40

Spark 2.0+

Spark 2.0提供了原生的窗口函数(SPARK-8641),并在解析和SQL 2003合规方面进行了一些额外的改进,因此它在实现核心功能时不再严重依赖于Hive,因此HiveContext(支持Hive的SparkSession)似乎略微不那么重要。

Spark < 2.0

显然如果想使用Hive,则必须使用HiveContext。除此之外,目前的最大区别是(Spark 1.5)支持窗口函数和访问Hive UDFs的能力。

总体而言,窗口函数是一个非常酷的功能,可以以简洁的方式解决相当复杂的问题,而无需来回切换RDD和DataFrame。性能仍然远非最佳,尤其是没有PARTITION BY子句时,但这确实不是Spark特有的。

关于Hive UDFs,现在不是一个严重的问题,但在Spark 1.5之前,许多SQL函数都使用Hive UDFs来表达,并且需要HiveContext才能工作。

HiveContext还提供了更强大的SQL解析器。例如,请参见:py4j.protocol.Py4JJavaError when selecting nested column in dataframe using select statetment

最后,HiveContext是启动Thrift服务器所必需的。

HiveContext的最大问题是它带有大型依赖项。


从您的评论中可以看出,HiveContext唯一的缺点似乎是它有大量的依赖项。除此之外,无论何时使用HiveContext而不是SqlContext都是一个安全的选择吗?我正在运行SparkR 1.6环境。 - prog_guy
"SparkSession在Spark 2.0中将SQLContext和HiveContext合并为一个对象。" - Kyle Bridenstine
在工程上下文中,最重要的是要考虑包含 "enableHiveSupport()",它将使用hive JARs启动本地thrift服务器(通常在端口10000上),该服务器将使用hive-site.xml中的javax连接参数与metastoreDB通信。 - human

5
在使用Spark SQL进行编程时,我们有两个入口点,具体取决于是否需要支持Hive。推荐使用HiveContext作为入口点,以提供对HiveQL和其他依赖于Hive的功能的访问。更基本的SQLContext提供了Spark SQL支持的子集,不依赖于Hive。
分离存在是为了那些可能与包含所有Hive依赖项发生冲突的用户。
HiveContext的附加功能,而在SQLContext中找不到的功能包括使用更完整的HiveQL解析器编写查询,访问Hive UDF以及读取来自Hive表的数据。
使用HiveContext不需要现有的Hive设置。

请参考以下编程相关内容的翻译:https://spark.apache.org/docs/1.6.1/sql-programming-guide.html。 - sdinesh94
即使 SQL 上下文环境不需要 Hive 设置。 - anubhav

3

HiveContext仍然是SqlContext的超集,它包含一些额外的属性,例如可以从hive-site.xml中读取配置。如果您使用Hive,则使用HiveContext,否则只需使用SqlContext。


我可以使用 swlContext 设置类似 hive.exec.dynamic.partition=true 这样的 Hive 属性吗? - Vikas Saxena

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接