Ich habe einige Tabellen in Hive, die das gleiche Präfix wie unten haben.
temp_table_name
temp_table_add
temp_table_area
Es gibt wenige Hunderte solcher Tabellen in meiner Datenbank, zusammen mit vielen anderen Tabellen. Ich möchte Tabellen löschen, die mit "temp_table" beginnen. Wissen Sie, ob Sie eine Abfrage kennen, mit der dies in Hive funktioniert?
Es gibt keine regulären Ausdrücke für die Drop-Abfrage in Hive (oder ich habe sie nicht gefunden). Es gibt jedoch mehrere Möglichkeiten, dies zu tun:
Mit einem Shell-Skript:
Hive -e "show tables 'temp_*'" | xargs -I '{}' Hive -e 'drop table {}'
Oder indem Sie Ihre Tabellen in einer bestimmten Datenbank ablegen und die gesamte Datenbank löschen.
Create table temp.table_name;
Drop database temp cascade;
Die oben genannten Lösungen sind gut. Wenn Sie jedoch mehr Tabellen zum Löschen haben, ist das Ausführen von 'Hive -e drop table' langsam. Also habe ich das benutzt:
Hive -e 'use db;show tables' | grep pattern > file.hql
verwenden Sie den vim-Editor, um file.hql zu öffnen und die folgenden Befehle auszuführen
:%s!^!drop table
:%s!$!;
dann renne
Hive -f file.hql
Dieser Ansatz wird viel schneller sein.
Ich konnte alle Tabellen mit den folgenden Schritten in Apache Spark mit Scala löschen:
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}"))
Da ich viele Tabellen löschen musste, habe ich den folgenden Befehl verwendet, der in der @HorusH-Antwort inspiriert ist
Hive -e "show tables 'table_prefix*'" | sed -e 's/^/ \DROP TABLE db_name\./1' | sed -e 's/$/;/1' > script.sh
Hive -f script.sh
Meine Lösung bestand darin, das Bash-Skript mit dem folgenden Befehl zu verwenden:
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
schnellste Lösung durch ein Shell-Skript:
drop_tables.sh pattern
Shell-Skript-Inhalt:
Hive -e 'use db;show tables' | grep $1 | sed 's/^/drop table db./' | sed 's/$/;/' > temp.hql
Hive -f temp.hql
rm temp.hql
Versuche dies:
Hive -e 'use sample_db; Tabellen anzeigen' | xargs -I '{}' Hive -e 'use sample_db; drop table {}'
Der folgende Befehl funktioniert auch.
Hive -e 'show tables' | grep table_prefix | while read line; do Hive -e "drop table $line"; done