■ はじめに
https://dk521123.hatenablog.com/entry/2023/02/21/223137
の続き。 「show tables」だと、default データベース内のテーブル一覧しか取得できず AWS Glue の Data Catalog の表示もバグっているのか取得できないテーブルがある。 っという訳で、 全データベースの全テーブル一覧を取得する方法を調べてみた。
目次
【1】全Hiveテーブルを取得する 1)サンプル 2)使用したシェルのTips 【2】全Hiveテーブルの詳細情報まで取得する 1)サンプル 2)使用したシェルのTips
【1】全Hiveテーブルを取得する
https://stackoverflow.com/questions/35004455/how-to-get-all-table-definitions-in-a-database-in-hive
にちょうどいいサンプルがあった。 これを少し改良して、全Hiveテーブルを取得するシェルを作ってみた
1)サンプル
#!/bin/bash echo "Start!" DELIMITER="," OUTPUT_FILE_NAME="hive_tables.tsv" rm ${OUTPUT_FILE_NAME} echo "database_name${DELIMITER}table_name" > ${OUTPUT_FILE_NAME} eval "hive -e 'show databases' | tee hive_databases.txt" cat hive_databases.txt | grep -v '^$' | while read database_name; do echo "## Database Name:" ${database_name} eval "hive -e 'show tables in ${database_name}' | grep -v ^$ | grep -v Logging | grep -v tab_name | tee ${database_name}_tables.txt" cat ${database_name}_tables.txt | while read table_name do echo "### ${database_name}.${table_name}" echo "${database_name}${DELIMITER}${table_name}" >> ${OUTPUT_FILE_NAME} done rm ${database_name}_tables.txt done rm hive_databases.txt echo "DONE... See ${OUTPUT_FILE_NAME}!!"
2)使用したシェルのTips
* ファイルを1行づつ読み込んでループさせる => 以下の関連記事の「【2】ファイル内容を表示する」を参照。
シェルでのファイルに関する処理あれこれ
https://dk521123.hatenablog.com/entry/2020/09/28/000000
【2】全Hiveテーブルの詳細情報まで取得する
上記「【1】全Hiveテーブルを取得する」の処理に 更に追加して「DESC FORMATTED <your_table_name>;」を 実行して、値を取る
1)サンプル
* 以下の情報をファイル出力する [1] database_name [2] table_name [3] Location [4] Table_Type [5] numPartitions [6] numRows [7] totalSize [8] LastAccessTime
sample.sh
#!/bin/bash echo "Start!" # Set delimiter (Now, set tab) DELIMITER="," OUTPUT_FILE_NAME="hive_tables_info.csv" rm ${OUTPUT_FILE_NAME} # FIRST, CREATE HEADER echo "database_name${DELIMITER}table_name${DELIMITER}Location${DELIMITER}Table_Type${DELIMITER}numPartitions${DELIMITER}numRows${DELIMITER}totalSize${DELIMITER}LastAccessTime" > ${OUTPUT_FILE_NAME} # Use SHOW DATABASES eval "hive -e 'show databases' | tee hive_databases.txt" cat hive_databases.txt | grep -v '^$' | while read database_name; do # Use SHOW TABLES IN <DATABASE> echo "## Database Name:" ${database_name} eval "hive -e 'show tables in ${database_name}' | grep -v ^$ | grep -v Logging | grep -v tab_name | tee ${database_name}_tables.txt" cat ${database_name}_tables.txt | while read table_name do # Use DESC FORMATTED <table_name> echo "### Table Name:" ${database_name}.${table_name} eval "hive -e 'desc formatted ${database_name}.${table_name}' | tee ${database_name}.${table_name}_details.txt" # Get params location=`grep -i "Location:" ${database_name}.${table_name}_details.txt | sed -e "s/^\([^:]*\):\(.*\)$/\2/" | sed 's/^ *\| *$//'` last_access_time=${last_access_time:--} table_type=`grep -i "Table Type:" ${database_name}.${table_name}_details.txt | sed -e "s/^\([^:]*\):\(.*\)$/\2/" | sed 's/^ *\| *$//'` table_type=${table_type:--} num_partitions=`grep -i "numPartitions" ${database_name}.${table_name}_details.txt | xargs echo | cut -d ' ' -f 2 | sed 's/^ *\| *$//'` num_partitions=${num_partitions:--} num_rows=`grep -i "numRows" ${database_name}.${table_name}_details.txt | xargs echo | cut -d ' ' -f 2 | sed 's/^ *\| *$//'` num_rows=${num_rows:--} total_size=`grep -i "totalSize" ${database_name}.${table_name}_details.txt | xargs echo | cut -d ' ' -f 2 | sed 's/^ *\| *$//'` total_size=${total_size:--} last_access_time=`grep -i "LastAccessTime:" ${database_name}.${table_name}_details.txt | sed -e "s/^\([^:]*\):\(.*\)$/\2/" | sed 's/^ *\| *$//'` last_access_time=${last_access_time:--} # OUTPUT INTO FILE echo "${database_name}${DELIMITER}${table_name}${DELIMITER}${location}${DELIMITER}${table_type}${DELIMITER}${num_partitions}${DELIMITER}${num_rows}${DELIMITER}${total_size}${DELIMITER}${last_access_time}" >> ${OUTPUT_FILE_NAME} # Remove table info file rm ${database_name}.${table_name}_details.txt done # Remove table list file rm ${database_name}_tables.txt done # Remove database list file rm hive_databases.txt echo "DONE... See ${OUTPUT_FILE_NAME}!!"
2)使用したシェルのTips
* 各パラメータの抽出 => 以下の関連記事の「【5】grepコマンドで抽出する」などを参照。
シェル ~ 文字列抽出あれこれ ~
https://dk521123.hatenablog.com/entry/2021/08/03/160901
関連記事
Hive / HiveQL ~ Hiveコマンド ~
https://dk521123.hatenablog.com/entry/2023/02/21/223137
シェルでのファイルに関する処理あれこれ
https://dk521123.hatenablog.com/entry/2020/09/28/000000
シェル ~ 文字列抽出あれこれ ~
https://dk521123.hatenablog.com/entry/2021/08/03/160901
sedコマンド
https://dk521123.hatenablog.com/entry/2019/11/23/101625
シェル ~ 基本編・条件分岐 if / case ~
https://dk521123.hatenablog.com/entry/2015/05/01/000043
シェル ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2014/10/23/005406
SSHクライアント
https://dk521123.hatenablog.com/entry/2019/10/18/233543
ssh コマンド / scp コマンド
https://dk521123.hatenablog.com/entry/2017/12/09/231200