2015-07-28 51 views
9

Il modello di creazione di query comuni in HiveQL (e SQL in generale) consente di selezionare tutte le colonne (SELECT *) o un set di colonne esplicitamente specificato (SELECT A, B, C). SQL non ha un meccanismo integrato per selezionare tutto tranne un insieme specifico di colonne.Hive UDF per la selezione di tutte tranne alcune colonne

Esistono vari meccanismi per l'esclusione di alcune colonne come indicato in this SO question ma nessuno si applica in modo naturale a HiveQL. (Per esempio, l'idea di creare una tabella temporanea con SELECT * poi ALTER TABLE DROP alcune delle sue colonne sarebbe devastare in un ambiente di grande di dati.)

Ignorando la discussione ideologica sul fatto che si tratta di una buona idea per selezionare tutte ma alcune colonne , questa domanda riguarda i possibili modi per estendere Hive con questa funzionalità.

Prima di Hive 0.13.0 SELECT può utilizzare colonne basate su espressioni regolari, ad esempio property_.* all'interno di una stringa tra virgolette. La risposta di @ invoketheshell sotto si riferisce a questa capacità, ma ha un costo, che è, quando questa funzionalità è attiva, Hive non può accettare colonne con caratteri non standard al loro interno, ad esempio $foo o x/y. Ecco perché gli sviluppatori di Hive hanno disattivato questo comportamento per impostazione predefinita in 0.13.0. Sto cercando una soluzione generica che funzioni per qualsiasi nome di colonna.

Una UDF generica per la generazione di tabelle (UDTF) potrebbe fare questo perché può manipulate the schema. Dal momento che non genereremo nuove righe, esiste un modo per risolvere questo problema utilizzando una UDF basata su file semplice?

Questo sembra un problema comune con molti post sul Web che mostrano come risolverlo per vari database, ma non sono stato in grado di trovare una soluzione per Hive. C'è codice da qualche parte che fa questo?

+1

Questo errore non risolto può causare problemi, poiché significa che non è possibile eseguire un'UDF, ad es. all_except (*, excluded_column1, excluded_column2) https://issues.apache.org/jira/browse/HIVE-1459 – mattinbits

+0

Grazie a @mattinbits. Ho votato per il problema e incoraggiato anche gli altri a farlo. – Sim

risposta

8

È possibile scegliere ogni colonna tranne quelle elencate in una specifica basata su espressioni regolari. Si tratta di colonne di query per esclusione. Vedi sotto:

Un'istruzione SELECT può utilizzare una specifica di colonna basata su espressioni regolari nelle versioni di Hive precedenti alla 0.13.0, o in 0.13.0 e versioni successive se la proprietà di configurazione hive.support.quoted.identifiers è impostata su none.

Detto questo si potrebbe creare una nuova tabella o vista utilizzando la seguente, e tutte le colonne tranne le colonne specificate verrà restituito:

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 
    --... 
; 

questo modo si crea una tabella che ha tutte le colonne da some_table ad eccezione delle colonne denominate column_to_remove_1, ..., per column_to_remove_N. Puoi anche scegliere di creare una vista.

+0

Sei un buon punto, ma il comportamento che descrivi non è generico in quanto non consente di colonne con caratteri non standard in loro, motivo per cui è disabilitato per impostazione predefinita in 0.13.0 e versioni successive. Ho aggiornato la domanda per chiarire che cerco un comportamento che non dipende da questa impostazione. – Sim