如何在Spark SQL中查询不同数据库同表的计数并生成带表名的多表比对结果
Spark SQL 跨库表行数批量比对实现
核心实现思路
不需要额外编写复杂的程序封装,基于已掌握的单表count能力,通过SQL逻辑即可完成全流程:分别统计两个库下目标表的行数、关联两侧统计结果、自动生成匹配标记,最终输出要求格式的四列结果。
步骤1:维护待比对的表名清单
在Spark会话中创建临时视图,把需要校验的11张表名统一维护在清单中,避免零散写表名导致遗漏:
-- 替换括号内的11个表名即可 CREATE OR REPLACE TEMP VIEW table_check_list AS SELECT * FROM VALUES ('table_1'), ('table_2'), ('table_3'), -- 逐行补全剩余8张表名 ('table_11') AS t(table_name);
步骤2:批量统计两侧表的计数值
两种实现方式可直接选用,按需调整:
方式1:纯SQL静态拼接(无需编写程序代码)
11张表的规模下,直接用UNION ALL把单表count的逻辑拼接成统一的统计结果,完全复用已有的单表count能力,逐行补全对应逻辑即可:
WITH db1_table_stats AS ( -- 逐行替换为DB1下对应表的count逻辑 SELECT 'table_1' AS table_name, COUNT(*) AS db1_count FROM DB1.table_1 UNION ALL SELECT 'table_2' AS table_name, COUNT(*) AS db1_count FROM DB1.table_2 UNION ALL -- 逐行补全剩余9张表的统计逻辑 SELECT 'table_11' AS table_name, COUNT(*) AS db1_count FROM DB1.table_11 ), db2_table_stats AS ( -- 逐行替换为DB2下对应表的count逻辑 SELECT 'table_1' AS table_name, COUNT(*) AS db2_count FROM DB2.table_1 UNION ALL SELECT 'table_2' AS table_name, COUNT(*) AS db2_count FROM DB2.table_2 UNION ALL -- 逐行补全剩余9张表的统计逻辑 SELECT 'table_11' AS table_name, COUNT(*) AS db2_count FROM DB2.table_11 ) -- 关联两侧结果,生成匹配标记 SELECT table_name AS `Table_name`, db1_count AS `DB1_count`, db2_count AS `DB2_count`, CASE WHEN db1_count = db2_count THEN 'Y' ELSE 'N' END AS `Match (Y/N) ?` FROM db1_table_stats INNER JOIN db2_table_stats USING(table_name);
方式2:动态生成统计逻辑(减少重复编码量)
如果不想逐行手写11段重复的count语句,可基于前面维护的表名清单,动态拼接所有统计SQL:
- 核心逻辑是遍历表名清单,自动生成
SELECT '表名' AS table_name, COUNT(*) AS 计数字段 FROM 库名.表名的代码片段,用UNION ALL拼接成完整的统计语句 - 拼接完成后直接执行,即可得到和方式1完全一致的统计结果。后续新增待比对表时,只需要修改清单里的表名,不需要调整统计逻辑
注意事项
- 分区表统计行数时,要和导出流程的过滤条件保持一致,避免因未过滤临时分区、增量残留数据导致计数偏差
- 上述逻辑的count统计会实时触发全表扫描,统计精度和单表执行count的精度完全一致,不会使用元数据中的估算值
- 输出结果的列名、匹配标记的判断逻辑完全匹配要求的格式,可直接导出留存
内容的提问来源于stack exchange,提问作者Shyam
相关产品推荐
相关产品推荐

