在Spark2.2中,基于成本的优化器选项已经启用。文档似乎是说,在启用此选项之前,我们需要分析Spark中的表。我想知道,当我们将来自Hive的所有表数据作为数据存储层时,这个选项是否有用。由于spark将使用Hivetablescan (避免映射/减少)读取Hive,所以在从Hive读取数据时使用CBO配置是否有意义。
发布于 2018-09-03 20:51:40
1艘班轮:
是的,CBO (spark.sql.cbo.enabled=true)对Hive表也很有用。
解释:
星火中的HiveTable由HiveTableRelation类表示。星表(或DataSource表)由LogicalRelation类表示。这两个类都扩展了LeadNode。使用“LogicalPlan”方法提取各种computeStats的统计信息。每个类都可以给出它对computeStats的实现。
如果代码,我们可以看到HiveTableRelation类重写了此方法,以返回表和列级别的统计数据(如果可用的话)。LogicalRelation类也做了同样的事情。
在HiveTableRelation中:
override def computeStats(conf: SQLConf): Statistics = {
tableMeta.stats.map(_.toPlanStats(output)).getOrElse {
throw new IllegalStateException("table stats must be specified.")
}
}
这反过来调用tableMeta.stats.map(_.toPlanStats(输出))。
CatalogStatistics中的代码:
def toPlanStats(planOutput: Seq[Attribute]): Statistics = {
val matched = planOutput.flatMap(a => colStats.get(a.name).map(a -> _))
Statistics(sizeInBytes = sizeInBytes, rowCount = rowCount,
attributeStats = AttributeMap(matched))
}
这表明Spark也重写了computeStats方法,该方法返回所有表级别以及列级别的统计信息。因此,如果表生成了统计数据,CBO将使用它们来优化计划。
发布于 2019-05-30 13:22:31
spark.sql.cbo.enabled=true
对于Hive表是不适用的,除非
ANALYZE TABLE <tblname> COMPUTE STATISTICS NOSCAN
(表的基本统计数据,使用FOR COLUMN
表示列级统计信息)是从火花触发的。
星星之火无法建立从Hive运行ANALYZE
命令所收集的统计数据。
只有当从火花引擎计算时,它才能使用统计数据。
如何将统计数据存储在Hive表中
统计数据存储在TBLPROPERTIES
中的Hive表中。
所有星火状态都有前缀spark.sql.statistics
的键。
代码参考。
https://stackoverflow.com/questions/52058565
复制相似问题