2013-05-06 10 views
11

Zastanawiam się, czy istnieje jakikolwiek sposób, aby faktycznie załadować dane CSV do binarnego formatu Hive - tj. Robiąc to samo, co ładowanie danych w relacyjnej bazie danych: parsowanie i typ konwertowanie danych wejściowych i przechowywanie w formacie binarnym (w inny plik binarny w przypadku Hive). Odnośnik Hive mówi, że polecenie load data inpath nie wykonuje żadnej transformacji, więc podejrzewam, że typy nie są konwertowane, np. Z ciągu na liczbę całkowitą. Czytałem o formatach OCR i RCFile, ale nie byłem w stanie dowiedzieć się, czy np. Wartości ciągów z pliku CSV są konwertowane na wartości liczbowe maszynowe i przechowywane w HDFS. Czy tak jest? Jakie są inne możliwości tworzenia binarnych reprezentacji plików CSV w Hive?Czy istnieje sposób na załadowanie danych CSV do "binarnego" formatu Hive?

Podobna uwaga: Podejrzewam, że Hive przekształca wartości ciągów w reprezentacje maszyn podczas przetwarzania zapytań i nie jest, na przykład, porównywanie wartości ciągów znaków - czy to założenie jest słuszne?

Odpowiedz

21

Domyślnie Hive przechowuje pliki jako zwykłe pliki tekstowe i przechowuje rekordy jako zwykły tekst, wszystkie nieskompresowane. Używa ASCII 0x1 dla separatora pól, co jest wygodniejsze niż przecinek dla niektórych danych wejściowych, ale jestem pewien, że udało ci się dowiedzieć, jak zmusić Hive do pracy z wartościami oddzielonymi przecinkami. Jeśli chcesz, aby Hive używał innego formatu pliku, inaczej serializuje/deserializuje lub kompresuje dane, masz do wyboru kilka różnych opcji.

Po wyjęciu z pudełka, Hive obsługuje kilka różnych formatów plików: TEXTFILE, SEQUENCEFILE i RCFILE. Różnice między tym, jak pliki są czytane, dzielone i pisane, muszą być różne. TEXTFILE jest ustawieniem domyślnym i działa na zwykłych plikach tekstowych. SEQUENCEFILE to dwójkowy format pary klucz-wartość, który jest łatwo wykorzystywany przez inne części ekosystemu Hadoop. I RCFILE jest kolumnowym sposobem na zapisywanie tabel Hive. Oprócz tych formatów plików możesz pisać własne lub znaleźć inne napisane przez siebie, aby spełnić różne wymagania.

Oprócz formatu plików, w którym zostały zapisane dane, można zdecydować, w jaki sposób rekordy w tabeli powinny zostać przekształcone do postaci szeregowej i przekształcone do postaci szeregowej, określając wartość SerDe. Hive 0.9.1 i nowsze są zapakowane w AvroSerDe, a Avro zapisuje dane w formacie binarnym (ma również sam schemat, który wprowadza pewne komplikacje). Wyszukiwarka Google dla "hive binarnego SerDe" ujawniła LazyBinarySerde, co brzmi jak prostszy sposób zapisywania w formacie binarnym. A jeśli nie możesz znaleźć niczego, co zaspokoi Twoje potrzeby, zawsze możesz napisać własną SerDe.

Wyobrażam sobie, że twoje pytanie pasuje do dużego kontekstu, w jaki sposób uczynić tabele Hive mniejszymi i/lub bardziej wydajnymi. W tym celu możesz zastosować kompresję na wszystko, co wspomniałem powyżej. Aby tego dokonać wystarczy powiedzieć gałąź do kompresji to wyjście i poinformować go, który kodek do kompresji przy użyciu następujących poleceń:

hive> set hive.exec.compress.output=true; 
hive> set mapred.output.compression.codec=org.apache.hadoop.io.compress.SnappyCodec 

Można to zmienić w plikach konfiguracyjnych, jeśli chcesz te ustawienia utrzymują się poza sesją (w tym inne people Hive i MapReduce jobs, jeśli udostępniasz klaster). Używam SnappyCodec, ponieważ działa on z Hive po wyjęciu z pudełka, jest rozszczepialny i zapewnia dobrą kompresję/dekompresję dla zużytego czasu procesora. Możesz zdecydować, że inny kodek jest bardziej odpowiedni do twoich potrzeb.

Teraz, jak zastosować te wszystkie opcje, jeśli wszystkie dane są w formacie CSV? Najprostszym sposobem jest utworzenie tabeli na plikach CSV, a następnie utworzenie kolejnej tabeli z żądanym formatem pliku i SerDe, a następnie wstawienie danych z tabeli CSV z powrotem do nowej tabeli (upewniając się, że kompresja wyjściowa Hive jest kompilowana) z wybranym kodem). Pod maską Hive zajmie się odczytywaniem danych z jednego formatu (CSV) i pisaniem do innego (cokolwiek zdecydujesz). Po tym będziesz mieć duplikat danych i możesz upuścić pliki CSV, jeśli chcesz.

CREATE EXTERNAL TABLE csv_table (id INT, name STRING) 
ROW FORMAT DELIMITED FIELDS TERMINATED BY "," 
LOCATION /user/muehlbau/yourData; 

CREATE TABLE binary_table (id INT, name STRING) 
ROW FORMAT SERDE org.apache.hadoop.hive.serde2.lazybinary.LazyBinarySerDe 
STORED AS SEQUENCEFILE; 

set hive.exec.compress.output=true; 
set mapred.output.compression.codec=org.apache.hadoop.io.compress.SnappyCodec 

INSERT OVERWRITE TABLE binary_table 
SELECT * FROM csv_table 

Powyższy przykład pokazuje, w jaki sposób można skorzystać ze wszystkich dostępnych opcji, ale nie sądzę, że jest to domyślnie rozsądnym przypadku użycia. Czytaj na temat różnych formatów plików/SerDes/kodeków kompresji i wykonaj testy wydajności, aby ustalić swoje podejście.

+0

Dziękujemy za szczegółowy opis! – muehlbau

+0

świetna odpowiedź! +1 – davek

Powiązane problemy