我正在开发spark sql应用程序,我有几个问题:我读到spark sql在封面下使用hive元存储?这是真的吗?我说的是一个纯sparksql应用程序,它不显式连接到任何配置单元安装。我正在启动一个sparksql应用程序,不需要使用hive。有什么理由用Hive吗?据我所知,sparksql比hive快得多;所以,我看不出有什么理由使用Hive。但我说的对吗?
shyt4zoc1#
初始化hivecontext()对象或spark shell时,它将连接到配置单元元存储,如果找不到,则示例化一个。使用配置单元的主要原因是,您是从配置单元的托管表中读取hdfs数据,还是希望从外部表中方便地进行选择。记住,hive只是一个读取和写入hdfs文件的镜头,而不是执行引擎本身。
olhwl3o22#
我读到spark sql在封面下使用hive元存储?这是真的吗?我说的是一个纯sparksql应用程序,它不显式连接到任何配置单元安装。sparksql不使用隐藏的配置单元元存储(默认为 in-memory 非配置单元目录,除非你在 spark-shell 相反)。默认的外部目录实现由spark.sql.catalogimplementation内部属性控制,可以是两个可能的值之一: hive 以及 in-memory .使用 SparkSession 了解正在使用的目录。
in-memory
spark-shell
hive
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 把它关掉。我正在启动一个sparksql应用程序,不需要使用hive。有什么理由用Hive吗?据我所知,sparksql比hive快得多;所以,我看不出有什么理由使用Hive。这是一个非常有趣的问题,可以有不同的答案(有些甚至主要基于意见,所以我们必须格外小心,并遵循stackoverflow规则)。有什么理由用Hive吗?不。但是…如果您想使用spark 2.2的最新特性,即基于成本的优化器,您可能会认为它是 ANALYZE TABLE 因为成本统计可能相当昂贵,所以对在不同spark应用程序运行中反复使用的表执行一次统计可以提高性能。请注意,没有配置单元的sparksql也可以做到这一点,但是有一些限制,因为本地默认的元存储仅用于单用户访问,并且在同时提交的spark应用程序之间重用元数据是行不通的。我看不出有什么理由用Hive。我写了一篇博文为什么spark sql如此痴迷于hive(在与hive相处了一天之后),我问了一个类似的问题,令我惊讶的是,直到现在(在我于2016年4月9日发表博客文章将近一年之后),我才明白hive metastore的概念为何如此重要,尤其是在多用户spark笔记本环境中。hive本身只是hdfs上的一个数据仓库,所以如果您有sparksql,那么就没有太多用处了,但是仍然有一些hive做得相当好的概念在sparksql中非常有用(直到它完全独立于一个类似hive的metastore)。
--conf spark.sql.catalogImplementation=in-memory
ANALYZE TABLE
2条答案
按热度按时间shyt4zoc1#
初始化hivecontext()对象或spark shell时,它将连接到配置单元元存储,如果找不到,则示例化一个。
使用配置单元的主要原因是,您是从配置单元的托管表中读取hdfs数据,还是希望从外部表中方便地进行选择。
记住,hive只是一个读取和写入hdfs文件的镜头,而不是执行引擎本身。
olhwl3o22#
我读到spark sql在封面下使用hive元存储?这是真的吗?我说的是一个纯sparksql应用程序,它不显式连接到任何配置单元安装。
sparksql不使用隐藏的配置单元元存储(默认为
in-memory
非配置单元目录,除非你在spark-shell
相反)。默认的外部目录实现由spark.sql.catalogimplementation内部属性控制,可以是两个可能的值之一:
hive
以及in-memory
.使用
SparkSession
了解正在使用的目录。请注意,我曾经
spark-shell
那会引起Hive意识SparkSession
所以我不得不从--conf spark.sql.catalogImplementation=in-memory
把它关掉。我正在启动一个sparksql应用程序,不需要使用hive。有什么理由用Hive吗?据我所知,sparksql比hive快得多;所以,我看不出有什么理由使用Hive。
这是一个非常有趣的问题,可以有不同的答案(有些甚至主要基于意见,所以我们必须格外小心,并遵循stackoverflow规则)。
有什么理由用Hive吗?
不。
但是…如果您想使用spark 2.2的最新特性,即基于成本的优化器,您可能会认为它是
ANALYZE TABLE
因为成本统计可能相当昂贵,所以对在不同spark应用程序运行中反复使用的表执行一次统计可以提高性能。请注意,没有配置单元的sparksql也可以做到这一点,但是有一些限制,因为本地默认的元存储仅用于单用户访问,并且在同时提交的spark应用程序之间重用元数据是行不通的。
我看不出有什么理由用Hive。
我写了一篇博文为什么spark sql如此痴迷于hive(在与hive相处了一天之后),我问了一个类似的问题,令我惊讶的是,直到现在(在我于2016年4月9日发表博客文章将近一年之后),我才明白hive metastore的概念为何如此重要,尤其是在多用户spark笔记本环境中。
hive本身只是hdfs上的一个数据仓库,所以如果您有sparksql,那么就没有太多用处了,但是仍然有一些hive做得相当好的概念在sparksql中非常有用(直到它完全独立于一个类似hive的metastore)。