当前位置: 首页 > article >正文

利用hive元数据统计数据量

对于数据量的统计,从表是否分区分为分区表非分区表两者有着不同的统计方式

非分区表

1. 利用传统方法count

2. 利用元数据计算:

select
sum(tb.param_value) AS TOTAL
from sys.tbls t
left join sys.dbs d
on t.db_id = d.db_id
left join sys.table_params tb
on t.tbl_id = tb.tbl_id
where
tb.param_key='numRows' 
and
d.name='dw'
and (t.tbl_name ='ods_pre_t_glj_nb_road_s')

但是有时候会出现特殊情况,有非分区表的numrows为0

此时需要执行:

ANALYZE TABLE dw.ods_pre_t_lwzx_zdsj COMPUTE STATISTICS;

重新再次执行SQL语句:numRows已经有数据了

分区表

select
    sum(e.PARAM_VALUE) as numRows
    from sys.TBLS t
    left join sys.DBS d
    on t.DB_ID = d.DB_ID
    left join sys.PARTITIONS a 
    on t.TBL_ID=a.TBL_ID
    left join sys.PARTITION_PARAMS e 
    on a.part_id=e.part_id
    where t.TBL_NAME='ods_pre_tbl_ex_waste'
    AND e.PARAM_KEY='numRows'

同样也会出现统计数量为0或NULL或者数据量缺少的情况,此时同样需要执行

ANALYZE TABLE dw.ods_pre_t_lwzx_zdsj COMPUTE STATISTICS;

ANALYZE TABLE

ANALYZE TABLE是什么?为什么每次元数据信息统计时总会出现个别统计不准确的情况?

ANALYZE TABLE 是 Hive 中用于收集表或分区统计信息的命令。它的作用是通过扫描数据文件来计算表或分区的关键统计信息,例如行数、数据大小、列值分布等。这些统计信息存储在 Hive 的元数据中,用于优化查询计划。

统计不准确的原因有很多,分区未被正确扫描、数据未完全加载或变动后未重新统计、数据文件格式的限制等等。

优化后的SQL:

SELECT
    a.tbl_id,a.tbl_name,COALESCE(IF(a.table_numRows=0,b.PARTITION_numRows,a.table_numRows),0) as numRows
    FROM
    (
    	-- 各表总行数
	    SELECT 
	    t.tbl_id,t.tbl_name,COALESCE(param_value,0) as table_numRows
	    from sys.TBLS t
	    left join sys.DBS d
	    on t.DB_ID = d.DB_ID
	    left join sys.table_params tb
		on t.tbl_id = tb.tbl_id
        -- 需要统计的数据库
		where d.name='dw'
		and tb.param_key='numRows' 
	)a
	left join
    (
	    -- 各分区表总行数
	    select 
	    a.tbl_id,SUM(COALESCE(PARAM_VALUE,0)) as PARTITION_numRows
	    from  
	    	sys.PARTITIONS a 
	    left join 
		    sys.PARTITION_PARAMS b
	    on a.part_id=b.part_id
	    WHERE b.PARAM_KEY='numRows'
	    GROUP BY a.tbl_id
	 )b
	 ON a.tbl_id=b.tbl_id

没有办法去批量的analyze表,可以写个shell脚本,执行以上优化后的SQL,将查询结果为0的表执行analyze以及所有分区表analyze后,再执行优化后的SQL。


http://www.kler.cn/a/399764.html

相关文章:

  • 编程之路,从0开始:结构体详解
  • 大数据技术Kafka详解 ① | 消息队列(Messages Queue)
  • 微信小程序底部button,小米手机偶现布局错误的bug
  • etcd部署(基于v3.5.15)
  • C++标准模板库 -- map和set
  • 怎么看待Ai发展前景?
  • 用python中的tkinter包实现进度条
  • 【C++】C++11 新特性揭秘:序章
  • window的Anaconda Powershell Prompt 里使用linux 命令
  • AIGC----生成对抗网络(GAN)如何推动AIGC的发展
  • 11.12.2024刷华为OD-集合的使用,递归回溯的使用
  • 【青牛科技】D2030 14W 高保真音频放大电路介绍和应用
  • 使用Mac下载MySQL修改密码
  • 【C++】了解map和set及平衡二叉树和红黑树的原理
  • 使用docker快速部署Nginx、Redis、MySQL、Tomcat以及制作镜像
  • ArcGIS Pro的arpx项目在ArcGIS Server中发布要素服务(FeatureServer)
  • ue中使用webui有效果白色拖动条 有白边
  • 【C++】构造与析构函数
  • 网络安全之国际主流网络安全架构模型
  • 已有docker增加端口号,不用重新创建Docker