2012-08-01 10 views
6

Wie kann ich Daten in Hive effizient speichern und komprimierte Daten in der Struktur speichern und abrufen? Momentan speichere ich es als Textdatei. Ich ging durch Bejoy article und ich fand, dass LZO-Komprimierung gut zum Speichern der Dateien und auch ist es teilbar.Effizientes Speichern der Daten in Hive

Ich habe eine HiveQL Select Abfrage, die eine Ausgabe erzeugt, und ich speichern diese Ausgabe irgendwo, so dass eine meiner Hive-Tabelle (Qualität) diese Daten verwenden kann, so dass ich diese quality Tabelle abfragen kann.

Unten ist die quality Tabelle, in der ich die Daten aus der folgenden SELECT-Abfrage laden werde, indem ich die Partition, die ich verwende, um Tabelle quality zu überschreiben.

create table quality 
(id bigint, 
    total bigint, 
    error bigint 
) 
partitioned by (ds string) 
row format delimited fields terminated by '\t' 
stored as textfile 
location '/user/uname/quality' 
; 

insert overwrite table quality partition (ds='20120709') 
SELECT id , count2 , coalesce(error, cast(0 AS BIGINT)) AS count1 FROM Table1; 

Also hier zur Zeit ich es als TextFile bin speichern, sollte ich dies als Sequence file machen und beginnen, die Daten in LZO compression format speichern? Oder Textdatei ist auch hier in Ordnung? Von der Select-Abfrage werde ich einige GB Daten bekommen, die täglich auf Tabellenqualität hochgeladen werden müssen.

Also welcher Weg ist am besten? Soll ich die Ausgabe als TextFile- oder SequenceFile-Format (LZO-Komprimierung) speichern, bekomme ich beim Abfragen der Hive-Qualitätstabelle ein Ergebnis faster. Die Abfrage ist schneller.

Update: -

Was, wenn ich als SequenceFile mit Block-Kompression bin Speicherung? Wie unten-

set mapred.output.compress=true; 
set mapred.output.compression.type=BLOCK; 
set mapred.output.compression.codec=org.apache.hadoop.io.compress.LzoCodec; 

Ich muss einige andere Dinge festlegen, um BLOCK-Komprimierung abgesehen von oben zu ermöglichen? Und auch erschaffe ich Tabelle als SequenceFile Format

Update erneut

Ich sollte die Tabelle wie diese unten erstellen? Oder müssen andere Änderungen vorgenommen werden, um die BLOCK-Komprimierung mit der Sequenzdatei zu aktivieren?

create table lipy 
(buyer_id bigint, 
    total_chkout bigint, 
    total_errpds bigint 
) 
partitioned by (dt string) 
row format delimited fields terminated by '\t' 
stored as sequencefile 
location '/apps/hdmi-technology/lipy' 
; 

Antwort

1

Ich habe nicht verwendet Hive viel, aber aus der Erfahrung mit Hadoop und strukturierten Daten, war ich die beste Leistung aus SequenceFiles mit BLOCK Kompression zu bekommen. Der Standardwert ist die Zeilenkomprimierung, aber er ist nicht so effizient wie die BLOCK-Komprimierung, wenn Sie strukturierte Daten speichern und Zeilen nicht besonders groß sind. Zum Einschalten habe ich mapred.output.compression.type = BLOCK

+0

Danke Alex für die Vorschläge. Also, wenn ich die Sequenz-Dateien mit BLOCK-Komprimierung verwenden muss, welche Parameter muss ich dann einstellen? Dies sind die Parameter, die ich einstellen muss? 'set mapred.output.compress = true set mapred.output.compression.type = BLOCK set mapred.output.compression.codec = org.apache.hadoop.io.compress.LzoCodec' Oder etwas anderes, was ich einstellen muss? – ferhan

+0

Ja, ich benutze diese 3 mit hadoop 0.20.2 Version und es ist genug. – alexeipab

+0

Danke für den Kommentar. Und ich habe versucht, die obigen 3 Befehle zu verwenden, und es hat gut funktioniert. Also meine Frage hier ist, wenn ich die Datei sehen muss, die im LzoCodec Format komprimiert wurde, dann was ich tun muss. Als ich versucht habe, vi filename zu verwenden, habe ich etwas komisches Zeichen in dieser Datei. Also muss ich diese Datei irgendwie dekomprimieren und dann muss ich diese Datei ansehen? Wenn ja, wie kann ich diese Datei dann dekomprimieren? Unten ist der Dateiname, den ich mit 'ls' erhalten habe.'/ apps/hdmi-technologie/b_apdpds/lip-data-quality/dt = 20120711/versuch_201207311206_10800_r_000000_0' – ferhan