Поведение, которое вы видите, может быть связано с устаревшей статистикой для определенных таблиц в HiveMetastore, и если на них ссылаются запросы.
Чтобы проверить это, вы можете проверить, запустив set hive.compute.query.using.stats;
на обоих Beeline- Hive и JDB C Клиентский сеанс, чтобы увидеть, установлено ли значение, установленное для свойства, в значение ИСТИНА или ЛОЖЬ.
Если установлено значение ИСТИНА, запрос будет получать статистику из HiveMetastore. (обычно это быстрее, так как он выбирает счет из HiveMetastore, а не путем выполнения задания MapReduce. Но он может вернуть неверный / устаревший счет, если статистика не обновлена в HiveMetastore для таблицы)
Если FALSE, запрос выполняет MapReduce как часть выполнения и выполняет подсчет записей, присутствующих в файлах данных в HDFS. По сравнению с предыдущим это отнимает много времени, но дает точные результаты.
Решение:
- Для свойства
hive.compute.query.using.stats
можно установить значение false, запустив приведенный ниже оператор в сеансах Beeline-Hive и JDB C Client. Таким образом, Hive будет выполнять подсчет на основе данных, представленных в HDFS через задание MapReduce.
set hive.compute.query.using.stats=false;
ИЛИ
Рассчитать статистику для таблиц вручную, выполнив приведенный ниже оператор в сеансах клиента Beeline-Hive или JDB C. Это обновит HiveMetastore с обновленной статистикой. После этого
count(*)
должен возвращать правильные результаты в любых сеансах Hive для этой таблицы.
ANALYZE TABLE <database_name>.<table_name> COMPUTE STATISTICS;
Надеюсь, это поможет!