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
Warum? ................ –