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.
Dziękujemy za szczegółowy opis! – muehlbau
świetna odpowiedź! +1 – davek