首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >带蜂巢表的spark.sql.cbo.enabled=true

带蜂巢表的spark.sql.cbo.enabled=true
EN

Stack Overflow用户
提问于 2018-08-28 13:00:12
回答 2查看 2.6K关注 0票数 2

在Spark2.2中,基于成本的优化器选项已经启用。文档似乎是说,在启用此选项之前,我们需要分析Spark中的表。我想知道,当我们将来自Hive的所有表数据作为数据存储层时,这个选项是否有用。由于spark将使用Hivetablescan (避免映射/减少)读取Hive,所以在从Hive读取数据时使用CBO配置是否有意义。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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中:

代码语言:javascript
运行
复制
  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中的代码:

代码语言:javascript
运行
复制
  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将使用它们来优化计划。

票数 0
EN

Stack Overflow用户

发布于 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的键。

代码参考

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52058565

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档