2015-07-04 20 views
5

Jeśli utworzyć tabelę i określić CSVSerde, wówczas wszystkie pola są konwertowane na typ łańcucha.Używanie CSV Serde z Hive utworzyć tabelę konwertuje wszystkie typy pól na ciąg

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) To Serde wynosi od https://github.com/ogrodnek/csv-serde

Jeśli próbuję serde 'org.apache.hadoop.hive.serde2.OpenCSVSerde' z tej strony https://cwiki.apache.org/confluence/display/Hive/CSV+Serde widziałem to samo. Wszystkie pola są zmieniane na ciąg znaków.

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

Odpowiedz

4

Tak, com.bizo.hive.serde.csv.CSVSerde tworzy tylko ciągi. Tak to zostało zbudowane i jak to zawsze będzie działać. Nie ma opcji, aby to zmienić. Myślę, że jest prawdopodobne, że zadziała to w przypadku większości zmiennych. Tak powiedziałem.

Użyj instrukcji SELECT, używając specyfikacji opartej na regexie, która może być używana w wydaniach gry Hive przed wersją 0.13.0 lub w wersji 0.13.0 i późniejszych, jeśli właściwość konfiguracyjna hive.support.quoted.identifiers jest ustawiona do żadnego. Oznacza to, że możesz szybko zbudować nową tabelę, zmieniając typy kilku zmiennych, które musisz mieć jako podwójne lub wewnętrzne.

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 

;

Za pomocą tej metody można dotknąć tylko zmiennych, które należy zmienić, i minimalizować długość zapytania. Możesz utworzyć widok na górze stołu, aby zapytać w ten sposób. Możesz też utworzyć zewnętrzną tabelę i upuścić stary stół;