Hive环境下多列空值统计的高效实现及报错排查
解决Hive统计多列空值及Tez执行错误问题
一、修正空值统计的SQL写法
你当前的COUNT(firstName)统计的是非空值数量,要得到空值计数,需要用以下两种正确方式:
方式1:总条数减去非空条数
SELECT COUNT(*) - COUNT(firstName) AS firstName_null_count, COUNT(*) - COUNT(lastName) AS lastName_null_count, COUNT(*) - COUNT(state) AS state_null_count FROM `ordertable`.customerinfo WHERE businessday = '2023-03-08'
方式2:CASE表达式统计空值
SELECT SUM(CASE WHEN firstName IS NULL THEN 1 ELSE 0 END) AS firstName_null_count, SUM(CASE WHEN lastName IS NULL THEN 1 ELSE 0 END) AS lastName_null_count, SUM(CASE WHEN state IS NULL THEN 1 ELSE 0 END) AS state_null_count FROM `ordertable`.customerinfo WHERE businessday = '2023-03-08'
二、解决TezTask执行错误
出现TezTask执行错误,可尝试以下排查方案:
- 临时切换执行引擎为MR:执行
SET hive.execution.engine=mr;后重新运行SQL,排除Tez资源或配置问题 - 检查资源配额:通过
SET hive.tez.container.size;查看容器内存,若资源不足可临时调大配额 - 验证表数据可用性:尝试加
LIMIT 10查询小范围数据,确认customerinfo表未损坏 - 检查分区有效性:若
businessday是分区字段,确认该分区数据存在且未损坏
三、多Schema多表的高效空值统计方案
要批量处理多Schema多表,避免重复编写SQL,可采用以下方法:
- 生成批量执行SQL:通过Hive元数据查询自动生成各表的空值统计语句,示例:
SELECT CONCAT( 'SELECT ''', table_schema, '.' , table_name, ''' AS table_name, ', GROUP_CONCAT( CONCAT('SUM(CASE WHEN ', column_name, ' IS NULL THEN 1 ELSE 0 END) AS ', column_name, '_null_count') SEPARATOR ', ' ), ' FROM ', table_schema, '.', table_name, ' WHERE businessday = ''2023-03-08'';' ) FROM information_schema.columns WHERE table_schema IN ('schema1', 'schema2') AND table_name IN ('table1', 'table2') AND column_name IN ('col1', 'col2', 'col3') GROUP BY table_schema, table_name;
执行该查询会生成每个表的空值统计SQL,复制后批量执行即可。
启用并行执行:设置
SET hive.exec.parallel=true;和SET hive.exec.parallel.thread.number=8;(根据集群资源调整),让多表查询并行运行提升效率。严格分区过滤:所有查询必须通过
businessday分区字段过滤,避免全表扫描,大幅降低计算开销。
内容的提问来源于stack exchange,提问作者Supernova
相关产品推荐
相关产品推荐

