Hiveには、以下のような同じプレフィックスを持つテーブルがほとんどありません。
temp_table_name
temp_table_add
temp_table_area
私のデータベースには、このようなテーブルが他の多くのテーブルとともに数百個あります。 「temp_table」で始まるテーブルを削除したい。 Hiveでこの作業を実行できるクエリを知っている人はいますか?
Hiveでのドロップクエリの正規表現などはありません(または見つかりませんでした)。しかし、それを行うための複数の方法があります、例えば:
シェルスクリプトの場合:
Hive -e "show tables 'temp_*'" | xargs -I '{}' Hive -e 'drop table {}'
または、特定のデータベースにテーブルを置き、データベース全体をドロップします。
Create table temp.table_name;
Drop database temp cascade;
私の解決策は、次のコマンドでbashスクリプトを使用することです。
Hive -e "SHOW TABLES IN db LIKE 'schema*';" | grep "schema" | sed -e 's/^/Hive -e \"DROP TABLE db\./1' | sed -e 's/$/\"/1' > script.sh
chmod +x script.sh
./script.sh
上記のソリューションは良いです。ただし、削除するテーブルがさらにある場合、「Hive -e drop table」の実行は遅くなります。だから、私はこれを使用しました:
Hive -e 'use db;show tables' | grep pattern > file.hql
vimエディターを使用してfile.hqlを開き、以下のコマンドを実行します
:%s!^!drop table
:%s!$!;
その後、実行します
Hive -f file.hql
このアプローチははるかに高速です。
Apache SparkとScalaで次の手順を使用して、すべてのテーブルを削除できました。
val df = sql("SHOW TABLES IN default LIke 'invoice*'").select("tableName") // to drop only selected column
val df = sql("SHOW TABLES IN default").select("tableName")
val tableNameList: List[String] = df.as[String].collect().toList
val df2 = tableNameList.map(tableName => sql(s"drop table ${tableName}"))
ドロップするテーブルがたくさんあったので、@ HorusHの答えに触発された次のコマンドを使用しました
Hive -e "show tables 'table_prefix*'" | sed -e 's/^/ \DROP TABLE db_name\./1' | sed -e 's/$/;/1' > script.sh
Hive -f script.sh
1つのシェルスクリプトによる最速のソリューション:
drop_tables.sh pattern
シェルスクリプトの内容:
Hive -e 'use db;show tables' | grep $1 | sed 's/^/drop table db./' | sed 's/$/;/' > temp.hql
Hive -f temp.hql
rm temp.hql
これを試して:
Hive -e 'use sample_db; show tables' | xargs -I '{}' Hive -e 'use sample_db; drop table {}'
以下のコマンドも機能します。
Hive -e 'show tables' | grep table_prefix | while read line; do Hive -e "drop table $line"; done