#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. Большое тебе спасибо, левое соединение! Я ценю вашу помощь. Первый вариант сработал как заклинание. Я попробую второй вариант и изучу его немного подробнее, так как я не использовал переменную для увеличения количества для каждой таблицы.