如何使 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_PARAMSPARTITION_PARAMS 中找到有关行数的信息。

    您应该将hive.compute.query.using.stats 设置为true 以利用元数据进行select count(*)... 等查询。

    但在此之前,请确保这些统计信息确实存在。

    如果没有,请先运行analyze table mytable compute statistics 来收集它。

    或者您可以将hive.stats.autogather 设置为true 以在将数据插入表时强制收集。

【讨论】:

以上是关于如何使 Hive 查询利用存储在 Metastore 中的统计信息的主要内容,如果未能解决你的问题,请参考以下文章

Presto统计信息

Hive学习之路Hive初识

如何使配置单元查询中的 max 函数忽略 _HIVE_DEFAULT_PARTITION__

如何使用标准查询或使用 UDF 标记一行并将其特定值存储在 Hive 中?

在选择查询中使用 hive 分桶

对存储在 Hive 中的数据运行 Pig 查询