我使用的是 Hive 版本 1.2.1。如果我运行 select count(*) from mytable
,我会看到它启动了 Tez 作业。显然它没有使用任何表统计信息,因为理想情况下应该从 Hive Metastore 中存储的表统计信息中获取行数。此外,我还显式检查了 Hive Metastore 中的所有表,但没有在那里找到任何表名称,这表明它存储了表统计信息。我能看到的唯一下一个最相关的表是 TAB_COL_STATS
,但该表仅存储列级统计信息,而且它也只有很少的行数,该表有 10 行。这提出了两个问题。
- 此版本的 Hive(1.2.1)不支持表统计吗?
- 如果这个 Metastore 表(即
TAB_COL_STATS
)存储所有内容,为什么像 num_rows 这样的列不属于该表架构的一部分?我看到 max、min、avg、num_distinct 等类型的列。 - 当我查询表中的某些统计信息(例如行数)时,我是否必须打开某些选项,以便它利用内部存储的统计信息而不是运行 Tez 作业?
最佳答案
- 支持表级统计。
- Hive 元存储表高度规范化。您可以在
TABLE_PARAMS
或PARTITION_PARAMS
中找到有关行数的信息。 您应该将
hive.compute.query.using.stats
设置为true
以便为select count(*) 等查询使用元数据...
。但在此之前,请确保这些统计数据确实存在。
如果没有,请先运行
分析表 mytable 计算统计信息
来收集它。或者您可以将
hive.stats.autogather
设置为true
以在将数据插入表时强制收集。
关于hive - 如何使 Hive 查询利用 Metastore 中存储的统计信息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59619593/