Hive 中的列统计




Introduction

本文档描述了对 a)HiveQL,b)metastore 模式和 c)metastore Thrift API 的更改,以支持 Hive 中的列级统计信息。请注意,该文档尚未描述将直方图持久保存在元存储中所需的更改。

Version information

列统计信息由HIVE-1362在 Hive 0.10.0 中引入。这是设计文件。

Hive 2.3 中的HIVE-11160引入了列统计信息自动收集。这也是设计文件。

有关 Hive 统计信息的一般信息,请参见Hive 统计。有关前 K 个统计信息的信息,请参见列级前 K 个统计信息

HiveQL changes

HiveQL 当前支持analyze command来计算表和分区的统计信息。 HiveQL 的分析命令将得到扩展,以触发 Hive 表/分区中一个或多个列上的统计信息计算。 HiveQL 的必要更改如下,

analyze table t [partition p] compute statistics for [columns c,...];

请注意,analyze 语句不支持表和列别名。

要查看列统计信息:

describe formatted [table_name][column_name];

Metastore Schema

为了保留列级统计信息,我们建议添加以下新表,

创建表 TAB_COL_STATS
(
CS_ID NUMBER NOT NULL,
TBL_ID NUMBER NOT NULL,
COLUMN_NAME VARCHAR(128)NOT NULL,
COLUMN_TYPE VARCHAR(128)NOT NULL,
TABLE_NAME VARCHAR(128)NOT NULL,
DB_NAME VARCHAR(128)NOT NULL,

LOW_VALUE RAW,
HIGH_VALUE RAW,
NUM_NULLS BIGINT,
NUM_DISTINCTS BIGINT,

Hive 3.0.0 中HIVE-16997中引入的 BIT_VECTOR,BLOB,/ *

AVG_COL_LEN DOUBLE,
MAX_COL_LEN BIGINT,
NUM_TRUES BIGINT,
NUM_FALSES BIGINT,
LAST_ANALYZED BIGINT 不为 NULL)

ALTER TABLE COLUMN_STATISTICS 添加约束 COLUMN_STATISTICS_PK 主键(CS_ID);

ALTER TABLE COLUMN_STATISTICS 添加约束 COLUMN_STATISTICS_FK1 初始引用的外键(TBL_ID)参考 TBLS(TBL_ID);

创建表 PART_COL_STATS
(
CS_ID NUMBER NOT NULL,
PART_ID NUMBER NOT NULL,

DB_NAME VARCHAR(128)NOT NULL,
COLUMN_NAME VARCHAR(128)NOT NULL,
COLUMN_TYPE VARCHAR(128)NOT NULL,
TABLE_NAME VARCHAR(128)NOT NULL,
PART_NAME VARCHAR(128)NOT NULL,

LOW_VALUE RAW,
HIGH_VALUE RAW,
NUM_NULLS BIGINT,
NUM_DISTINCTS BIGINT,

Hive 3.0.0 中HIVE-16997中引入的 BIT_VECTOR,BLOB,/ *

AVG_COL_LEN DOUBLE,
MAX_COL_LEN BIGINT,
NUM_TRUES BIGINT,
NUM_FALSES BIGINT,
LAST_ANALYZED BIGINT 不为 NULL)

ALTER TABLE COLUMN_STATISTICS 添加约束 COLUMN_STATISTICS_PK 主键(CS_ID);

ALTER TABLE COLUMN_STATISTICS 添加约束 COLUMN_STATISTICS_FK1 最初延迟了对外键(PART_ID)引用分区(PART_ID);

Metastore Thrift API

我们建议添加以下 Thrift 结构以传输列统计信息:

struct BooleanColumnStatsData {
1:必填的 i64 numTrue,
2:必填的 i64 numFalses,
3:必需的 i64 numNulls
}

struct DoubleColumnStatsData {
1:必须为 double lowValue,
2:必须是 double highValue,
3:必需的 i64 numNulls,
4:必需的 i64 numDV,

5:可选字符串 bitVectors

}

struct LongColumnStatsData {
1:必需的 i64 lowValue,
2:必需的 i64 highValue,
3:必需的 i64 numNulls,
4:必需的 i64 numDV,

5:可选字符串 bitVectors
}

struct StringColumnStatsData {
1:必需的 i64 maxColLen,
2:必填项 avgColLen,
3:必需的 i64 numNulls,
4:必需的 i64 numDV,

5:可选字符串 bitVectors
}

struct BinaryColumnStatsData {
1:必需的 i64 maxColLen,
2:必填项 avgColLen,
3:必需的 i64 numNulls
}

struct Decimal {
1:必需的二进制未缩放的,
3:必需的 i16 比例尺
}

struct DecimalColumnStatsData {
1:可选的十进制 lowValue,
2:可选的十进制高值,
3:必需的 i64 numNulls,
4:必需的 i64 numDV,
5:可选字符串 bitVectors
}

结构日期{
1:必需的 i64 天
}

struct DateColumnStatsData {
1:可选的 Date lowValue,
2:可选的日期 highValue,
3:必需的 i64 numNulls,
4:必需的 i64 numDV,
5:可选字符串 bitVectors
}

联合 ColumnStatisticsData {
1:BooleanColumnStatsData booleanStats,
2:LongColumnStatsData longStats,
3:DoubleColumnStatsData doubleStats,
4:StringColumnStatsData stringStats,
5:BinaryColumnStatsData binaryStats,
6:DecimalColumnStatsData decimalStats,
7:DateColumnStatsData dateStats
}

struct ColumnStatisticsObj {
1:必需的字符串 colName,
2:必需的字符串 colType,
3:必需的 ColumnStatisticsData statsData
}

struct ColumnStatisticsDesc {
1:必填布尔值 isTblLevel,
2:必需的字符串 dbName,
3:必需的字符串 tableName,
4:可选字符串 partName,
5:可选的 i64 lastAnalyzed
}

struct ColumnStatistics {
1:必需的 ColumnStatisticsDesc statsDesc,
2:必填列表\ statsObj;
}

我们建议添加以下 Thrift API 以持久,检索和删除列统计信息:

bool update_table_column_statistics(1:ColumnStatistics stats_obj)引发(1:NoSuchObjectException o1,
2:InvalidObjectException o2、3:MetaException o3、4:InvalidInputException o4)
bool update_partition_column_statistics(1:ColumnStatistics stats_obj)引发(1:NoSuchObjectException o1,
2:InvalidObjectException o2、3:MetaException o3、4:InvalidInputException o4)

ColumnStatistics get_table_column_statistics(1:string db_name,2:string tbl_name,3:string col_name)抛出
(1:NoSuchObjectException o1、2:MetaException o2、3:InvalidInputException o3、4:InvalidObjectException o4)
ColumnStatistics get_partition_column_statistics(1:string db_name,2:string tbl_name,3:string part_name,
4:string col_name)引发(1:NoSuchObjectException o1、2:MetaException o2,
3:InvalidInputException o3,4:InvalidObjectException o4)

bool delete_partition_column_statistics(1:string db_name,2:string tbl_name,3:string part_name,4:string col_name)抛出
(1:NoSuchObjectException o1、2:MetaException o2、3:InvalidObjectException o3,
4:InvalidInputException o4)
bool delete_table_column_statistics(1:string db_name,2:string tbl_name,3:string col_name)抛出
(1:NoSuchObjectException o1、2:MetaException o2、3:InvalidObjectException o3,
4:InvalidInputException o4)

请注意,删除表后,需要 delete_column_statistics 从元存储中删除条目。另请注意,当前 Hive 不支持放置列。

请注意,在项目的 V1 中,我们将仅支持标量统计信息。此外,我们将仅支持静态分区,即应该在 analyze 命令中指定分区键和分区值。在以下版本中,我们将在 analyst 命令中添加对高度平衡直方图的支持以及对动态分区的支持,以用于列级统计。