首页 > 解决方案 > 如何在 SELECT 语句中使用表名获取不同数据库中同一张表的 COUNT?

问题描述

我正在使用 Spark SQL 将 11 个表从一个数据库 (DB1) 完全导出到另一个数据库 (DB2)。导出完成后,我将 DB1 和 DB2 上每个表的计数与表名进行比较,并检查它们是否匹配(或)不匹配。输出列应该是,

Table_name   DB1_count   DB2_count   Match (Y/N) ?
table_1         500         500           Y
table_2         376         325           N

到目前为止,我已经能够获取一张表的第 2 列和第 3 列。但是,我不确定如何为多个表和第 1 列和第 4 列实现相同的操作。

标签: sqlscalaapache-sparkapache-spark-sql

解决方案


假设你有两张桌子:

t1:

DB1_count   DB2_count
500         500

t2:

DB1_count   DB2_count
376         325

您可以添加表名列和匹配列,并进行联合:

select 'table_1' as Table_name,
       DB1_count, DB2_count,
       case when DB1_count = DB2_count then Y else N end as Match
from t1
union all
select 'table_2' as Table_name,
       DB1_count, DB2_count,
       case when DB1_count = DB2_count then Y else N end as Match
from t2

要动态生成查询,您可以尝试:

val names = Seq(("table_1", "t1"), ("table_2", "t2"))
val query = names.map(x => s"""
select '${x._1}' as Table_name,
       DB1_count, DB2_count,
       case when DB1_count = DB2_count then Y else N end as Match
from ${x._2}
""").mkString("\nunion_all\n")

val result = spark.sql(query)

推荐阅读