web-dev-qa-db-ja.com

Hiveで同じプレフィックスを持つ複数のテーブルを削除する

Hiveには、以下のような同じプレフィックスを持つテーブルがほとんどありません。

temp_table_name
temp_table_add
temp_table_area

私のデータベースには、このようなテーブルが他の多くのテーブルとともに数百個あります。 「temp_table」で始まるテーブルを削除したい。 Hiveでこの作業を実行できるクエリを知っている人はいますか?

13

Hiveでのドロップクエリの正規表現などはありません(または見つかりませんでした)。しかし、それを行うための複数の方法があります、例えば:

  • シェルスクリプトの場合:

    Hive -e "show tables 'temp_*'" | xargs -I '{}' Hive -e 'drop table {}'
    
  • または、特定のデータベースにテーブルを置き、データベース全体をドロップします。

    Create table temp.table_name;
    
    Drop database temp cascade;
    
17
Tremo

私の解決策は、次のコマンドで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
5
HorusH

上記のソリューションは良いです。ただし、削除するテーブルがさらにある場合、「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

このアプローチははるかに高速です。

5
Chandra

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}"))
3
user1977823

ドロップするテーブルがたくさんあったので、@ 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
2
dirceusemighini

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
0
user2359902

これを試して:

Hive -e 'use sample_db; show tables' | xargs -I '{}' Hive -e 'use sample_db; drop table {}'

0
Ganesh B

以下のコマンドも機能します。

 Hive -e 'show tables' | grep table_prefix |  while read line; do Hive -e "drop table $line"; done
0
kamoor