SHOW VALUE STAT 可在数据库中统计数据概况, 比如统计最大值最小值和null值的数量. 不计算词频, 如需统计词频可使用 AnalyticalTable 工具.
可以对 jdbc(mysql, presto, gbase, hive, clickhouse) / solr / es / mongo / hbase / execl / csv / json 等与数据执行字段分析.
别名:
SHOW COLUMN STATS(与SHOW VALUE STAT完全等价, 见SySqlShowValueStatEntity构造方法)
语法说明
SHOW VALUE STAT [选项] FROM 数据源 [WHERE 条件] [GROUP BY 字段] [LIMIT 样本数]
- 举例:
SHOW VALUE STAT FROM table
SHOW VALUE STAT FROM table WHERE date_key = '2021-03-24'
SHOW VALUE STAT FROM table WHERE date_key = '2021-03-24' limit 10000
SHOW VALUE STAT distinct FROM table WHERE date_key = '2021-03-24' limit 10000
SHOW VALUE STAT sum_mod FROM table WHERE date_key = '2021-03-24' limit 10000
SHOW VALUE STAT distinct sum_mod SINGLE_ROW FROM table WHERE date_key = '2021-03-24' limit 10000
/* 子查询数据源 */
SHOW VALUE STAT FROM (select a+1 as a, b+1 as b from table1)
/* 流水线虚拟表数据源 */
SHOW VALUE STAT FROM @sybn_last_select@table
/* 分组统计 */
SHOW VALUE STAT FROM table GROUP BY cinema_name
FROM 支持三种数据源
| 数据源 | 语法 | 适用场景 |
|---|---|---|
| 表名 | FROM db.table |
表名需匹配英文字母+点号(如 pre_ods.sdm_pos_sale_bill);查库时自动 show create table 解析字段类型/注释 |
| 子查询 | FROM (select ...) |
支持混合数据源(跨库子查询);适合对聚合/join 后的中间结果做探查 |
| 虚拟表 | FROM @sybn_last_select@table |
后缀为 @table 的会话变量;对流水线上一条 source 结果做统计,无需落库 |
选项列表 (不区分大小写)
| 参数 | 用途 | 默认 | 说明 |
|---|---|---|---|
| DISTINCT | 是否开启count(distinct x) | 隐藏 | 开启会占用大量数据库资源 |
| SUM | 是否开启sum(x) | 隐藏 | 某些大数字字段, 开启sum可能会数字越界 |
| SUM_MOD | 是否开启sum(mod(x, 100000000)) | 隐藏 | 不容易数字越界的求和 |
| HIDE_COUNT | 是否隐藏count(1) | 开启 | ⚠️ 当前版本已解析但未实际生效, all_num 始终输出 |
| HIDE_MAX | 是否隐藏max(x) | 开启 | - |
| HIDE_MIN | 是否隐藏min(x) | 开启 | 字符串字段的 empty_str__ 也会一并隐藏 |
| HIDE_NULL | 是否隐藏null_num | 开启 | - |
| HIDE_TYPE | 是否隐藏字段类型 | 开启 | 比如: int(10) |
| HIDE_COMMENT | 是否隐藏字段备注 | 开启 | - |
| SINGLE_ROW | 是否单行模式输出 | 每字段一行 | 多表对比时可开启单行模式 union all 聚合 |
WHERE / GROUP BY / LIMIT 子句
| 子句 | 行为 | 注意点 |
|---|---|---|
WHERE |
源数据过滤(先 where 过滤再统计) | 不是对统计结果过滤 |
GROUP BY |
按字段分组, 每组分别统计 | 分组字段不参与统计, 仅作为分组键 |
LIMIT |
样本数限制, 依数据源实现不同 | 表名+JDBC 实现 GetQueryInterface 时作为源数据 limit;其他场景作用在最终统计 SQL;不支持 limit > 100000 |
输出字段
默认 pivot 模式(每行一个字段的统计)
每行包含一个字段的统计, field_name 列标识字段名. 带 GROUP BY 时, 每个分组×每个字段=一行.
| 列名 | 含义 | 控制选项 |
|---|---|---|
field_name |
字段名 | — |
field_comment__字段名 |
字段注释(来自 show create table) | HIDE_COMMENT |
field_type__字段名 |
字段类型 | HIDE_TYPE |
max_value__字段名 |
最大值 | HIDE_MAX |
min_value__字段名 |
最小值(字符串字段会跳过空串) | HIDE_MIN |
empty_str__字段名 |
空串数量(仅字符串字段) | HIDE_MIN |
null_num__字段名 |
null 值数量 | HIDE_NULL |
count_distinct__字段名 |
distinct 值数量 | DISTINCT |
sum_value__字段名 |
求和(仅数字字段) | SUM |
sum_mod_value__字段名 |
求和 mod 1e8(仅数字字段) | SUM_MOD |
all_num |
总行数(分组级别) | — |
SINGLE_ROW 模式(单行模式)
跳过 pivot, 每个分组一行, 所有字段的统计列保留原 xxx__字段名 形式. 多表对比时可开启 SINGLE_ROW + union all 聚合.
与流水线配合
SHOW VALUE STAT 是 auxiliary 类命令, 不消费栈、不压栈, 可在流水线任意位置插入而不影响后续承接. 常用于对上一条 source 结果做旁路探查:
/* 第1步: 查询数据并压栈 */
select cinema_name, pay_amount from pre_ods.sdm_pos_sale_bill;
/* 第2步: 旁路分析栈顶结果, 不出栈不影响后续 */
show value stat distinct from @sybn_last_select@table;
/* 第3步: 仍可承接第1步的栈顶做转换 */
appendColumns(影院类型 := '连锁' as 临时列)
典型用法
/* 1. 数据探查: 看一张表所有字段的值分布 */
show value stat from pre_ods.sdm_pos_sale_bill
/* 2. 数据质量: 加 distinct 看唯一值数量, 看空值率 */
show value stat distinct from pre_dim.bi_cinema_org_info
/* 3. 看数字字段求和(大数用 sum_mod 防溢出) */
show value stat sum_mod hide_type hide_comment from pre_ods.sdm_pos_sale_bill
/* 4. 配合子查询: 先聚合再统计中间结果 */
show value stat from (
select cinema_name, sum(pay_amount) as total
from pre_ods.sdm_pos_sale_bill
group by cinema_name
)
/* 5. 按分组看: 每个影院的字段值分布 */
show value stat from pre_ods.sdm_pos_sale_bill group by cinema_name
/* 6. 限制样本数: 大表先取 10000 行样本快速看分布 */
show value stat from pre_ods.sdm_pos_sale_bill limit 10000
设计参考
本命令的思路来源(非简单复刻, 在借鉴基础上有大量扩展):
- 命名与输出形态: 借鉴 Apache Impala 的
SHOW COLUMN STATS语法(自 Impala 1.2.2 / 2014 年起). 本类将其作为别名保留(见SySqlShowValueStatEntity构造方法中SHOW COLUMN STATS解析分支). Impala 输出形态(每列一行统计 + 字段名/类型/distinct/nulls 等指标)与本命令的 pivot 默认输出一致. 差异: Impala 读取 metastore 中预计算统计(供查询优化器使用), 本命令实时扫描数据(供数据探查使用). - 子查询与字段语义: 借鉴 Presto/Trino 的
SHOW STATS FOR (query)语法(自 Presto 0.179 / 2016 年起). 相同点: 均支持(SELECT ...)子查询、均包含 distinct_values_count / nulls_fraction / low_value / high_value 等字段、均通过子查询实现源数据过滤. 差异: Presto/Trino 通过 connector 元数据返回(供 CBO 优化器使用), 本命令实时计算, 且支持 WHERE 子句直接过滤源数据(无需包成子查询). - 间接影响: Apache Hive
ANALYZE TABLE(列级统计的概念祖先)、PostgreSQLpg_stats视图(列级统计的存储/查询分离思想)、AWS Athenashow stats for table(基于 Presto, 语法相同). - 本命令独有扩展(开源方言均无): 实时计算、
SUM/SUM_MOD求和(含 mod 1e8 防溢出)、empty_str__空串统计、GROUP BY分组统计、DISTINCT输出开关、HIDE_MAX/MIN/NULL/TYPE/COMMENT输出列控制、SINGLE_ROW单行/pivot 双模式、LIMIT样本数、与流水线@虚拟表配合做旁路探查(不消费堆栈).
相关源码
- 实体类:
d:\java\work\sybn\sybn_util\sybn-core\src\main\java\cn\sybn\util\io\db\sql\sysql\show\SySqlShowValueStatEntity.java - 执行器:
d:\java\work\sybn\sybn_util\sybn-core\src\main\java\cn\sybn\util\io\db\common\helper\other\SySqlShowValueStatEntityFinder.java - 测试类:
d:\java\work\sybn\sybn_util\sybn-core\src\test\java\cn\sybn\util\io\db\common\helper\finder\SySqlShowValueStatEntityFinderTest.java