это потому что искра глупа. Команда 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, что действительно ужасно. (