Apache Spark SQLContext和HiveContext有什么区别?
一些资料称,由于HiveContext是SQLContext的超集,开发人员应始终使用具有比SQLContext更多功能的HiveContext。但目前每个上下文的API大部分相同。
- 在哪些场景下使用SQLContext/HiveContext更加有用?
- 仅在使用Hive时HiveContext更有用吗?
- 或者,只使用SQLContext在实现Apache Spark大数据应用程序时就足够了吗?
Apache Spark SQLContext和HiveContext有什么区别?
一些资料称,由于HiveContext是SQLContext的超集,开发人员应始终使用具有比SQLContext更多功能的HiveContext。但目前每个上下文的API大部分相同。
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仍然是SqlContext的超集,它包含一些额外的属性,例如可以从hive-site.xml中读取配置。如果您使用Hive,则使用HiveContext,否则只需使用SqlContext。