1 лайнер:
Да CBO (spark.sql.cbo.enabled = true) также полезен для таблиц Hive.
Пояснение:
HiveTable в Spark представлен классом HiveTableRelation . Таблица Spark (или таблица DataSource) представлена классом LogicalRelation . Оба этих класса расширяют LeadNode. Spark обобщает статистику всех видов LogicalPlan с помощью метода "computeStats". Каждый класс может предоставить свою реализацию для computeStats.
Если в коде мы видим, что класс HiveTableRelation переопределил этот метод, чтобы вернуть статистику уровня таблицы и столбца, если они доступны. То же самое делает LogicalRelation class.
В 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 (output)).
Код в каталогеСтатистика:
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 HiveTableRelation также переопределил computeStats метод, и этот метод возвращает всю статистику уровня таблицы, а также статистику уровня столбца. Таким образом, если в таблице сгенерирована статистика, она будет использоваться CBO для оптимизации плана.