【Hive】全Hiveテーブルを取得するには

■ はじめに

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