如何在hive或impala中计算表统计信息可以加快Spark SQL中的查询速度?

时间:2016-09-22 07:23:06

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

为了提高性能(例如,对于连接),建议首先计算表静态。

在Hive我可以做::

analyze table <table name> compute statistics;

在Impala中:

compute stats <table name>;

我的spark应用程序(从hive-tables读取)是否也受益于预先计算的统计数据?如果是,我需要运行哪一个?它们是否都保存了hive Metastore中的统计数据?我在Cloudera 5.5.4上使用spark 1.6.1

注意: 在参数spark.sql.autoBroadcastJoinThreshold的文档火花1.6.1(https://spark.apache.org/docs/1.6.1/sql-programming-guide.html)中,我找到了一个提示:

  

请注意,目前只有Hive Metastore支持统计信息   表命令ANALYZE TABLE COMPUTE STATISTICS   noscan已经运行。

3 个答案:

答案 0 :(得分:3)

这是即将推出的Spark 2.3.0(可能已经在2.2.1或更早版本中发布了一些功能)。

  

我的spark应用程序(从hive-tables读取)是否也受益于预先计算的统计数据?

如果Impala或Hive记录了Spark可以读取的表元数据中的Hive Metastore中的表统计信息(例如表大小或行计数)(并将其转换为自己的Spark统计信息以进行查询规划)。

您可以使用DESCRIBE EXTENDED中的spark-shell SQL命令轻松查看。

scala> spark.version
res0: String = 2.4.0-SNAPSHOT

scala> sql("DESC EXTENDED t1 id").show
+--------------+----------+
|info_name     |info_value|
+--------------+----------+
|col_name      |id        |
|data_type     |int       |
|comment       |NULL      |
|min           |0         |
|max           |1         |
|num_nulls     |0         |
|distinct_count|2         |
|avg_col_len   |4         |
|max_col_len   |4         |
|histogram     |NULL      |
+--------------+----------+

ANALYZE TABLE COMPUTE STATISTICS noscan计算Spark使用的一个统计量,即表的总大小(由于noscan选项没有行计数度量)。如果Impala和Hive将其记录到“正确”位置,Spark SQL将在DESC EXTENDED中显示它。

DESC EXTENDED tableName用于表级统计信息,看看是否找到了由Impala或Hive生成的统计信息。如果它们位于DESC EXTENDED的输出中,它们将用于优化连接(并且还会针对聚合和过滤器启用基于成本的优化)。

列统计信息在表属性中存储(以Spark特定的序列化格式),我确实怀疑Impala或Hive可以计算统计信息并以Spark SQL兼容格式存储它们。

答案 1 :(得分:2)

我假设你在使用hive上下文的Spark(或)Spark-Sql上使用Hive。如果是这种情况,您应该在配置单元中运行analyze。

分析表&lt; ...&gt;通常需要在创建表之后运行,或者是否存在重要的插入/更改。如果这是MR或火花作业,您可以在加载步骤结束时执行此操作。

在分析时,如果您在火花上使用蜂巢 - 请使用以下链接中的配置。您可以在会话级别为每个查询设置此项。我在生产中使用了这个链接https://cwiki.apache.org/confluence/display/Hive/Hive+on+Spark%3A+Getting+Started中的参数,它运行正常。

答案 2 :(得分:1)

据我所知,impala上的计算统计数据是最新的实现,让您无需调整配置单元设置。

来自官方文件:

  

如果您使用基于Hive的收集统计信息的方法,请参阅   Hive wiki,了解有关Hive上所需配置的信息   侧。 Cloudera建议使用Impala COMPUTE STATS语句   避免潜在的配置和可扩展性问题   统计数据收集过程。

     

如果运行Hive语句ANALYZE TABLE COMPUTE STATISTICS FOR   COLUMNS,Impala只能使用生成的列统计信息   表是未分区的。 Impala无法使用Hive生成的列   分区表的统计信息。

有用的链接: https://www.cloudera.com/documentation/enterprise/5-5-x/topics/impala_perf_stats.html