2015-07-28 14 views
9

Das allgemeine Abfragebildmuster in HiveQL (und SQL im Allgemeinen) besteht darin, entweder alle Spalten (SELECT *) oder eine explizit angegebene Gruppe von Spalten (SELECT A, B, C) auszuwählen. SQL verfügt nicht über einen integrierten Mechanismus zum Auswählen aller außer einer angegebenen Gruppe von Spalten.Hive-UDF zum Auswählen aller außer einigen Spalten

Es gibt verschiedene Mechanismen zum Ausschließen einiger Spalten, wie in this SO question beschrieben, aber keine trifft natürlich auf HiveQL zu. (Zum Beispiel der Idee, eine temporäre Tabelle erstellen mit SELECT * dann ALTER TABLE DROP einige ihren Spalten würden Chaos in einer großen Datenumgebung anrichten.)

Ignorieren die ideologische Diskussion darüber, ob es eine gute Idee, alle aber einige Spalten auswählen In dieser Frage geht es um die Möglichkeiten, Hive mit dieser Fähigkeit zu erweitern.

Vor Hive 0.13.0 konnte SELECT regulärausdrucksbasierte Spalten verwenden, z. B. property_.* innerhalb eines Strings mit umgekehrten Anführungszeichen. Die Antwort von @ invoketheshell bezieht sich auf diese Fähigkeit, aber sie hat ihren Preis: Wenn diese Funktion aktiviert ist, kann Hive keine Spalten mit nicht standardmäßigen Zeichen akzeptieren, z. B. $foo oder . Aus diesem Grund haben die Hive-Entwickler dieses Verhalten standardmäßig in 0.13.0 deaktiviert. Ich suche nach einer generischen Lösung, die für jeden Spaltennamen funktioniert.

Eine generische Tabelle erzeugende UDF (UDTF) tun könnte dies sicherlich, weil es kann manipulate the schema. Da wir keine neuen Zeilen generieren werden, gibt es eine Möglichkeit, dieses Problem mit einer einfachen zeilenbasierten UDF zu lösen.

Dies scheint ein häufiges Problem mit vielen Posts im Web zu sein, die zeigen, wie man es für verschiedene Datenbanken löst, aber ich konnte keine Lösung für Hive finden. Gibt es irgendwo Code, der das macht?

+1

Dieser ungelöste Fehler kann Probleme verursachen, da es bedeutet, dass Sie keine UDF, z. all_except (*, excluded_column1, excluded_column2) https://issues.apache.org/jira/browse/HIVE-1459 – mattinbits

+0

Danke @mattinbits. Ich habe für das Thema gestimmt und ermutige andere dazu. – Sim

Antwort

8

Sie können jede Spalte auswählen, mit Ausnahme derjenigen, die in einer Regex-basierten Spezifikation aufgeführt sind. Dies sind Abfragespalten durch Ausschluss. Siehe unten:

Eine SELECT-Anweisung kann regexbasierte Spaltenspezifikation in Hive-Versionen vor 0.13.0 oder in Version 0.13.0 und höher verwenden, wenn die Konfigurationseigenschaft hive.support.quoted.identifiers auf none festgelegt ist.

Dass gesagt wird eine neue Tabelle oder Sicht die folgenden erstellen können, und alle Spalten mit Ausnahme der angegebenen Spalten zurückgegeben werden:

hive.support.quoted.identifiers=none;  

drop table if  exists database.table_name; 
create table if not exists database.table_name as 
    select `(column_to_remove_1|...|column_to_remove_N)?+.+` 
    from database.some_table 
    where 
    --... 
; 

Dies wird eine Tabelle erstellen, die alle Spalten von some_table hat außer den Spalten column_to_remove_1, ..., column_to_remove_N. Sie können stattdessen auch eine Ansicht erstellen.

+0

Sie machen einen guten Punkt, aber das von Ihnen beschriebene Verhalten ist nicht generisch, da Spalten mit nicht standardmäßigen Zeichen nicht zulässig sind. Aus diesem Grund ist es standardmäßig in Version 0.13.0 und höheren Versionen deaktiviert. Ich habe die Frage aktualisiert, um klarzustellen, dass ich ein Verhalten suche, das nicht von dieser Einstellung abhängt. – Sim

Verwandte Themen