Сценарий оболочки для извлечения количества строк из всех таблиц улья в нескольких базах данных улья

#linux #shell #hive #sh

Вопрос:

Я пытаюсь создать сценарий оболочки, который будет извлекать подсчеты строк во всех таблицах из нескольких баз данных. Все базы данных следуют одному и тому же соглашению об именовании «the_same_databasename»lt;%gt;, за исключением последнего слоя в имени, который варьируется. Я пытаюсь выполнить следующее:

use lt;database_namegt;; show tables; select count(*) from lt;table_namegt;;

Поскольку у меня 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   

У меня нет большого опыта в написании сценариев в оболочке, поэтому я очень признателен за любые рекомендации/помощь. Заранее спасибо.

Ответ №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  

Комментарии:

1. Большое тебе спасибо, левое соединение! Я ценю вашу помощь. Первый вариант сработал как заклинание. Я попробую второй вариант и изучу его немного подробнее, так как я не использовал переменную для увеличения количества для каждой таблицы.