2015-07-04 18 views
5

Se creo una tabella e specifica un CSVSerde, tutti i campi vengono convertiti in tipo stringa.Utilizzo di CSV Serde con Hive create table converte tutti i tipi di campo in stringa

hive> create table foo(a int, b double, c string) row format serde 'com.bizo.hive.serde.csv.CSVSerde' stored as textfile; OK Time taken: 0.22 seconds hive> describe foo; OK a string from deserializer b string from deserializer c string from deserializer Time taken: 0.063 seconds, Fetched: 3 row(s) Questo Serde è da https://github.com/ogrodnek/csv-serde

Se provo il serde 'org.apache.hadoop.hive.serde2.OpenCSVSerde' da questa pagina https://cwiki.apache.org/confluence/display/Hive/CSV+Serde ho visto la stessa cosa. Tutti i campi sono stati modificati per digitare una stringa.

Hive versione 1.2.1 Hadoop versione 2.7.0 versione java "1.7.0_80"

risposta

4

Sì l'com.bizo.hive.serde.csv.CSVSerde crea solo le stringhe. È così che è stato costruito e come funzionerà sempre. Non c'è alcuna opzione per cambiarlo. Penso che sia probabile che funzioni per la maggior parte delle tue variabili. Detto questo lo farei.

Utilizzare un'istruzione SELECT utilizzando una specifica di colonna basata su espressioni regolari, che può essere utilizzata 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 a nessuno. Ciò significa che puoi creare rapidamente una nuova tabella alterando i tipi delle poche variabili che devi avere come doppie o intersezioni.

set hive.support.quoted.identifiers=none; 

drop table if  exists database.table_name; 
create table if not exists database.table_name as 
select `(a|b|c)?+.+` 
    , cast(a as double) as a 
    , cast(b as double) as b 
    , cast(c as double) as c 
    from database.some_table 

;

È possibile utilizzare questo metodo per toccare solo le variabili che devono essere modificate e minimizzando la lunghezza della query. È possibile creare la vista sulla parte superiore della tabella per eseguire query in questo modo. O potresti creare una tabella esterna e rilasciare la vecchia tabella;