2017-07-23 5 views
1

ich eine neue Tabelle in Hive bin zu schaffen mit:mit einer Datei Tabelle in Hive erstellen

CREATE TABLE new_table AS select * from old_table; 

Mein Problem ist, dass, nachdem die Tabelle erstellt wird, ist es, mehrere Dateien für jede Partition erzeugt - während ich nur wollen eine Datei für jede Partition.

Wie kann ich es in der Tabelle definieren? Vielen Dank!

+0

Warum? ................ –

Antwort

0

Es gibt viele mögliche Lösungen:

1) In distribute by partition key am Ende der Anfrage. Vielleicht gibt es viele Partitionen pro Reduzierer und jeder Reduzierer erstellt Dateien für jede Partition. Dies kann auch die Anzahl der Dateien und den Speicherverbrauch reduzieren.

2) Einfach, ziemlich gut, wenn es nicht zu viele Daten gibt: fügen Sie order by hinzu, um einzelnen Reduzierer zu zwingen. Oder setzen Sie hive.exec.reducers.bytes.per.reducer=500000000; --500M Dateien. Dies ist für einzelne Reducer-Lösung ist für nicht zu viele Daten, es wird langsam laufen, wenn es viele Daten gibt.

3) Wenn auf mapreduce läuft, schalten Sie merge:

set hive.merge.mapfiles=true; 
set hive.merge.mapredfiles=true; 
set hive.merge.size.per.task=500000000; --Size of merged files at the end of the job 
set hive.merge.smallfiles.avgsize=500000000; --When the average output file size of a job is less than this number, 
--Hive will start an additional map-reduce job to merge the output files into bigger files 

4) Wenn auf Tez läuft

set hive.merge.tezfiles=true; 
set hive.merge.size.per.task=500000000; 
set hive.merge.smallfiles.avgsize=500000000; 

5) Für ORC-Dateien können Sie sie mit diesem Befehl fusionieren: ALTER TABLE T [PARTITION partition_spec] CONCATENATE; - für ORC

Verwandte Themen