Hive 使用统计信息优化简单查询,例如 select count(*)。如果设置了这个属性:
set hive.compute.query.using.stats=true;
然后 Hive 将从存储在元数据中的统计数据中进行计数。
当您用新文件替换文件时,统计信息保持不变。当您删除分区时,所有相关的统计信息也被删除,这就是您重新创建分区后得到正确计数的原因。
另请参阅此答案:HIVE select count() non null returns higher value than select count() - 在这种情况下,谓词阻止使用统计信息。
这种行为是意料之中的。你可以
set hive.compute.query.using.stats=false;
要关闭查询结果计算的统计信息使用,您的分区重新创建有效地执行相同的操作,因为它删除了统计信息,这就是不使用统计信息并扫描文件的原因。
或者您可以分析表以更新统计信息并保持上述参数设置为真,这样下次您将执行简单聚合时,它会很快工作:
ANALYZE TABLE tablename [PARTITION(partcol1[=val1], partcol2[=val2], ...)]
COMPUTE STATISTICS
对于只有 50 条记录的小文件,性能差异并没有那么大。但最好更新统计信息,优化器也使用它来构建最佳查询计划。
更多详情:analyze table
如果您使用INSERT OVERWRITE 插入数据,您可以启用统计信息自动收集:
set hive.stats.autogather=true;