我正在开发Spark SQL应用程序,但有几个问题:
最佳答案
Spark SQL不在幕后使用Hive元存储(除非您在in-memory
中进行相反的操作,否则默认为spark-shell
非Hive目录)。
默认的外部目录实现由 spark.sql.catalogImplementation 内部属性控制,并且可以是两个可能的值之一:hive
和in-memory
。
使用SparkSession
知道正在使用什么目录。
scala> :type spark
org.apache.spark.sql.SparkSession
scala> spark.version
res0: String = 2.4.0
scala> :type spark.sharedState.externalCatalog
org.apache.spark.sql.catalyst.catalog.ExternalCatalogWithListener
scala> println(spark.sharedState.externalCatalog.unwrapped)
org.apache.spark.sql.hive.HiveExternalCatalog@49d5b651
请注意,我使用的
spark-shell
确实会启动Hive感知的SparkSession
,因此我必须使用--conf spark.sql.catalogImplementation=in-memory
来启动它以将其关闭。这是一个非常有趣的问题,可以有不同的答案(有些答案甚至主要基于观点,因此我们必须格外小心并遵守StackOverflow规则)。
不。
但是...如果您想使用Spark 2.2的最新功能(即基于成本的优化器),则可能需要考虑将其作为
ANALYZE TABLE
进行成本统计可能会非常昂贵,因此对于在以下情况下使用过的表进行一次处理在不同的Spark应用程序运行中再次进行操作可以提高性能。请注意,没有Hive的Spark SQL也可以做到,但是有一些限制,因为本地默认元存储仅用于单用户访问,并且无法同时使用跨提交的Spark应用程序重用元数据。
我写了一个博客文章Why is Spark SQL so obsessed with Hive?! (after just a single day with Hive),我问了一个类似的问题,令我惊讶的是,直到现在(我在2016年4月9日发布博客文章大约一年后),我认为我已经理解了Hive metastore的概念为何如此重要的,特别是在多用户Spark笔记本环境中。
Hive本身只是HDFS上的数据仓库,因此如果有Spark SQL,不会有太多用处,但是Hive仍然有一些概念做得很好,这些概念在Spark SQL中有很多用处(直到它完全独立为止)一个类似Hive的metastore)。