Разница между Spark и Hive с помощью команды ANALYZE TABLE - - PullRequest
0 голосов
/ 04 января 2019

Команда ANALYZE TABLE, запускаемая из Spark для таблицы Hive, не дает такого же улучшения производительности, как та же команда, выданная из Hive.

Например, я вставил фрейм данных в пустую таблицу Hive: -

output.write.insertInto(“XXXXXXXX”)

и затем выполните команду анализа таблицы: -

spark.sql("ANALYZE TABLE XXXXXXXX COMPUTE STATISTICS")

Когда я делаю подсчет записей в Hive, это очень медленно: -

select count(*) from XXXXXXXX;
+-----------+
|    _c0    |
+-----------+
| 12345678  |
+-----------+
1 row selected (36.038 seconds)

Но если я запускаю ту же команду анализа таблицы непосредственно в Hive, производительность улучшается: -

select count(*) from XXXXXXXX;
+-----------+
|    _c0    |
+-----------+
| 12345678  |
+-----------+
1 row selected (0.096 seconds)

Кто-нибудь может объяснить, почему возникает такая разница? Есть ли обходной путь?

1 Ответ

0 голосов
/ 17 апреля 2019

это потому что искра глупа. Команда Spark ANALYZE TABLE записывает только вычисленную статистику в Spark-совместимом формате в свойства таблицы, о которых Hive не знает. Spark полностью игнорирует стандартную статистику таблицы Hive при ее записи.

если вы делаете

show create table XXXXXXXX

в Hive после шага spark.sql ("ANALYZE ..") в вашем запросе вы увидите следующее в разделе tbl_properties:

TBLPROPERTIES ( 
  'numFiles'='1', 
  'numRows'='-1', 
  'rawDataSize'='-1', 
  'spark.sql.statistics.numRows'='12345678', 
  'spark.sql.statistics.totalSize'='12345678', 
  'totalSize'='12345678', 

только после выполнения той же команды в улье вы получите правильную информацию:

TBLPROPERTIES ( 
  'numFiles'='1', 
  'numRows'='12345678', 
  'rawDataSize'='12345678', 
  'spark.sql.statistics.numRows'='12345678', 
  'spark.sql.statistics.totalSize'='12345678', 
  'totalSize'='12345678', 

Может ли Spark правильно заполнять поля numRows и rawDataSize при вычислении статистики? Наверное. Почему он этого не делает? Без понятия. :( Вероятно, разработчики-искры превосходят выполнение оптимизаций для таких скромных систем, как Hive. (Даже если другие фреймворки, такие как Apache Impala, также выиграют от правильной статистики здесь - потому что Impala использует их правильно)

Единственный обходной путь - выполнить задание Spark с помощью соответствующего задания куста, выполнив команду compute statistics, что действительно ужасно. (

...