Apache Spark SQLContext和HiveContext有什么区别?

时间:2015-11-12 07:49:11

标签: apache-spark hive apache-spark-sql

Apache Spark SQLContext和HiveContext有什么区别?

有些消息称,由于HiveContext是SQLContext的超集,因此开发人员应始终使用HiveContext,它具有比SQLContext更多的功能。但是每个上下文的当前API大多是相同的。

  • SQLContext / HiveContext更有用的场景是什么?
  • 只有在使用Hive时,HiveContext才更有用吗?
  • 或者,使用Apache Spark实现大数据应用程序需要SQLContext吗?

3 个答案:

答案 0 :(得分:38)

Spark 2.0 +

Spark 2.0提供本机窗口函数(SPARK-8641),并在解析和更好的SQL 2003合规性方面提供了一些额外的改进,因此它很少依赖Hive来实现核心功能,因为HiveContext (Hive支持SparkSession)似乎稍微不那么重要了。

Spark< 2.0

显然,如果您想使用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最大的问题是它带有大的依赖关系。

答案 1 :(得分:3)

对Spark SQL进行编程时,我们有两个入口点,具体取决于 我们是否需要Hive支持。建议的入口点是HiveContext to 提供对HiveQL和其他Hive相关功能的访问。更基本的 SQLContext提供了不依赖的Spark SQL支持的子集 配置单元。

- 对于可能与包括全部冲突的用户存在分离 Hive依赖项。

- 在SQLContext中找不到的HiveContext的其他功能包括使用更完整的HiveQL解析器编写查询,访问Hive UDF以及从Hive表读取数据的功能。

- 使用HiveContext不需要现有的Hive设置。

答案 2 :(得分:3)

HiveContext仍然是sqlcontext的超集,它包含一些额外的属性,例如它可以从hive-site.xml读取配置,万一你有hive使用,否则只需使用sqlcontext