2017-06-19 18 views
5

Przetwarzam plik csv za pomocą ateny AWS z kodu Java. Niektóre kolumny w CSV są typu daty, a jedna kolumna ma przecinek w wartości.Przetwarzanie CSV za pomocą ats atsna

Jeśli Athena tabela jest tworzona z

ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.lazy.LazySimpleSerDe'

to jest w stanie analizować kolumny z przecinkiem poprawnie

jednak analizuje poprawnie, jeśli mogę użyć

ROW FORMAT SERDE 'org.apache.hadoop.hive.serde2.OpenCSVSerde'

Ale problem z OpenCSVSerde polega na tym, że wymaga on wszystkich kolumny, które mają być typu danych ciąg i muszę przeprowadzić operacje daty w kwerendzie, więc nie można użyć OpenCSVSerde.

Jakieś inne rozwiązanie? Proszę o pomoc!

+0

dowiedziałeś się rozwiązanie –

Odpowiedz

2

Tak zaprojektowano te dwa SerDes, powinieneś używać tylko LazySimpleSerDe w przypadkach, gdy twoje dane są stosunkowo czyste, na przykład, nie mają wartości ujętych w cudzysłowy lub nie mają ograniczników w wartości. I OpenCSVSerde działa dobrze dla deserializacji plików CSV, które mają wartości ujęte w cudzysłowy; jednak wszystkie kolumny w tabeli mają typ danych STRING. Więcej informacji: here

W twoim przypadku, ponieważ Twoje dane nie są czyste, jedynym sposobem na przeanalizowanie tego i załadowanie do Ateny jest użycie OpenCSVSerde. A jeśli chcesz użyć operacji na datach, musisz ręcznie przekonwertować/przeanalizować ciągi znaków daty w obiekcie daty, co jest dość łatwe do zrobienia przy pomocy funkcji date_parse.

więc powiedzieć, jeśli masz następujący ciąg danych w kolumnie data type:

11/13/2017 
11/14/2017 
11/15/2017 
11/16/2017 

Można wykorzystać następującą kwerendę, aby wybrać datę w przedziale

select * from somedb.sometable where date_parse(createdate, '%m/%d/%Y') between DATE'2017-11-14' and DATE'2017-11-16'; 
Powiązane problemy