我可以使用SparkSession获取Hive中的表列表,或访问Hive表,如下面的代码所示。现在我的问题是,在这种情况下,我是否正在使用Spark with Hive Context?
或者是在Spark中使用hive上下文,我必须直接使用HiveContext对象来访问表,并执行其他与Hive相关的函数吗?
spark.catalog.listTables.show
val personnelTable = spark.catalog.getTable("personnel")
答案 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支持。