sybn sybn-util 项目说明文档 - 基于java的跨数据库联合查询

show value stat 分析表数据

2023-02-23
sybn

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(列级统计的概念祖先)、PostgreSQL pg_stats 视图(列级统计的存储/查询分离思想)、AWS Athena show 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

Comments

暂不开放评论! 可微信联系