【问题标题】:Shell script to pull row counts from all Hive tables in multiple Hive databases从多个 Hive 数据库中的所有 Hive 表中提取行数的 Shell 脚本
【发布时间】:2025-12-14 18:15:01
【问题描述】:

我正在尝试创建一个 shell 脚本,该脚本将从多个数据库中提取所有表中的行数。所有数据库都遵循相同的命名约定“the_same_databasename_”,但名称中的最后一层不同。我正在尝试运行以下命令:

use <database_name>; show tables; select count(*) from <table_name>;

由于我有 40 个不同的数据库,我需要为每个数据库运行前两个查询 40 次不同的时间,加上选择计数查询甚至更多,具体取决于数据库中有多少表(非常耗时)。我将我的 PuTTy 配置设置设置为将我的 PuTTy 会话保存到本地目录上的 .txt 中,这样我就可以在我的命令行界面中直接显示行计数结果。到目前为止,这就是我所拥有的,但不确定如何包含最终命令以从每个数据库中的表中获取实际行数。

#!/bin/bash
for db in $(hive -e "show databases like 'the_same_databasename_*;") 
do
   tbl_count=$(hive -S -e "use $db; show tables;" | wc -l)
   echo "Database $db contains $tbl_count tables."
  
done    

我在 shell 脚本方面不是很有经验,因此非常感谢任何指导/帮助。提前致谢。

【问题讨论】:

    标签: linux shell hive sh


    【解决方案1】:

    你可以使用嵌套的for循环:

    #!/bin/bash
    for db in $(hive -e "show databases like 'the_same_databasename_*;") 
    do
       tbl_count=$(hive -S -e "use $db; show tables;" | wc -l)
       echo "Database $db contains $tbl_count tables."
    
       for table in $(hive -S -e "use $db; show tables;")
       do
          count=$(hive -S -e "use $db; select count(*) from $table;")
          echo "Table $db.$table contains $count rows."
       done
       
    done
    

    或者您可以使用变量来增加表的计数

    #!/bin/bash
    for db in $(hive -e "show databases like 'the_same_databasename_*;") 
    do
    
       tbl_count=0
       for table in $(hive -S -e "use $db; show tables;")
       do
          (( tbl_count++ ))
          count=$(hive -S -e "use $db; select count(*) from $table;")
          echo "Table $db.$table contains $count rows."
       done
       echo "Database $db contains $tbl_count tables."
       
    done
    

    【讨论】:

    • 非常感谢,leftjoin!我很感激帮助。第一个选项就像一个魅力。我将尝试第二个并进一步研究它,因为我没有使用变量来增加每个表的计数。