SparkSession总是使用Hive Context吗?

时间:2017-10-24 21:07:15

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

我可以使用SparkSession获取Hive中的表列表,或访问Hive表,如下面的代码所示。现在我的问题是,在这种情况下,我是否正在使用Spark with Hive Context?

或者是在Spark中使用hive上下文,我必须直接使用HiveContext对象来访问表,并执行其他与Hive相关的函数吗?

spark.catalog.listTables.show
val personnelTable = spark.catalog.getTable("personnel")

2 个答案:

答案 0 :(得分:2)

  

我可以使用SparkSession获取Hive中的表列表,或访问Hive表,如下面的代码所示。

是的,你可以!

  

现在我的问题是,在这种情况下,我是否使用Spark with Hive Context?

这取决于您创建spark值的方式。

SparkSession具有enableHiveSupport方法附带的Builder界面。

  

enableHiveSupport():Builder 启用Hive支持,包括与持久性Hive Metastore的连接,对Hive serdes的支持以及Hive用户定义的函数。

如果您使用该方法,则您获得了Hive支持。如果不是,那么,你没有。

您可能认为spark.catalog与Hive有某种关联。好吧,它的目的是提供Hive支持,但默认情况下目录为in-memory

  

目录:目录用户可通过其创建,删除,更改或查询基础数据库,表格,函数等的接口。

spark.catalog只是Spark SQL带有两个实现的接口 - in-memory(默认)和hive

现在,你可能会问自己这个问题:

  

无论如何,例如通过spark.conf,找出是否已启用配置单元支持?

没有isHiveEnabled方法或类似方法,我知道你可以用来知道你是否使用了Hive-aware SparkSession(事实上你不是&# 39;不需要这种方法,因为您负责创建SparkSession实例,因此您应该知道Spark应用程序的功能。

在您获得SparkSession实例(例如spark-shell或Databricks)的环境中,检查特定SparkSesssion是否启用了Hive支持的唯一方法是查看目录实现的类型。

scala> spark.sessionState.catalog
res1: org.apache.spark.sql.catalyst.catalog.SessionCatalog = org.apache.spark.sql.hive.HiveSessionCatalog@4aebd384

如果您看到HiveSessionCatalog已使用,则SparkSession实例可识别Hive。

答案 1 :(得分:0)

在spark-sheel中,我们也可以使用spark.conf.getAll。此命令将返回spark会话配置,我们可以看到“spark.sql.catalogImplementation - > hive”建议Hive支持。