apache-spark - 在 hive 或 impala 中计算表统计数据如何加速 Spark SQL 中的查询?

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

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

在 hive 中,我可以做到:

analyze table <table name> compute statistics;

在黑斑羚:
compute stats <table name>;

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

笔记:
在 spark 1.6.1 ( https://spark.apache.org/docs/1.6.1/sql-programming-guide.html ) 的文档中,参数 spark.sql.autoBroadcastJoinThreshold我发现了一个提示:

Note that currently statistics are only supported for Hive Metastore tables where the command ANALYZE TABLE COMPUTE STATISTICS noscan has been run.

最佳答案

这是即将发布的 Spark 2.3.0(也许某些功能已经在 2.2.1 或更早的版本中发布了)。

Does my spark application (reading from hive-tables) also benefit from pre-computed statistics?



如果 Impala 或 Hive 将表统计信息(例如表大小或行数)记录在 Spark 可以读取的表元数据中的 Hive 元存储中(并将其转换为自己的 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 兼容格式中。

关于apache-spark - 在 hive 或 impala 中计算表统计数据如何加速 Spark SQL 中的查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39632724/

相关文章:

python - 声明 UDF 时 Spark 出错

java - Apache Spark 如何将函数发送到引擎盖下的其他机器

scala - Spark SQL配置单元连接错误

hadoop - 与配置单元中的外部表混淆

apache-spark - 如何在 Spark 中收集单个列?

apache-spark - HDFS 批量分析

apache-spark - 如何设置默认的 Spark 日志记录级别?

sql - 双 "group by"没有加入?

scala - 如何将 groupBy().count() 添加到源 DataFrame?

scala - 在 Scala Spark 中加入不同的 Dataframe 时动态选择多个列