spark.sql.cbo.enabled = true с таблицей Hive - PullRequest
0 голосов
/ 28 августа 2018

В Spark 2.2 была включена опция Оптимизатора затрат. Документация говорит, что нам нужно проанализировать таблицы в Spark, прежде чем включить эту опцию. Я хотел бы знать, полезна ли эта опция, когда все данные таблицы поступают из Hive в качестве слоя хранения данных. Поскольку spark будет читать Hive с использованием Hivetablescan (избегая Map / Reduce), имеет ли смысл использовать конфигурацию CBO при чтении данных из Hive.

Ответы [ 2 ]

0 голосов
/ 30 мая 2019

spark.sql.cbo.enabled=true - это НЕ полезно для таблиц Hive, если
ANALYZE TABLE <tblname> COMPUTE STATISTICS NOSCAN (Основная статистика для таблицы, используйте FOR COLUMN для статистики на уровне столбцов) запускается из Spark.

Spark не может получить статистику, полученную при запуске команды ANALYZE из Hive.
Он может использовать статистику только тогда, когда вычисляется из движка Spark.

Как статистика хранится в таблице Hive

Статистика хранится в таблице Hive в TBLPROPERTIES.
Все характеристики Spark имеют ключи с префиксом spark.sql.statistics.
Код ссылки .

0 голосов
/ 03 сентября 2018

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 для оптимизации плана.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...