如何使 Hive 查询利用存储在 Metastore 中的统计信息
Posted
技术标签:
【中文标题】如何使 Hive 查询利用存储在 Metastore 中的统计信息【英文标题】:How to make a Hive query take advantage of statistics stored in Metastore 【发布时间】:2020-01-06 22:03:52 【问题描述】:我正在使用 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 作业?
【问题讨论】:
【参考方案1】:-
支持表级统计。
Hive 元存储表高度规范化。您可以在
TABLE_PARAMS
或PARTITION_PARAMS
中找到有关行数的信息。
您应该将hive.compute.query.using.stats
设置为true
以利用元数据进行select count(*)...
等查询。
但在此之前,请确保这些统计信息确实存在。
如果没有,请先运行analyze table mytable compute statistics
来收集它。
或者您可以将hive.stats.autogather
设置为true
以在将数据插入表时强制收集。
【讨论】:
以上是关于如何使 Hive 查询利用存储在 Metastore 中的统计信息的主要内容,如果未能解决你的问题,请参考以下文章
如何使配置单元查询中的 max 函数忽略 _HIVE_DEFAULT_PARTITION__