Wie andere erwähnt haben Sie nicht explizit eine Zielgröße pro Datei treffen kann. Sie können jedoch alle Ausgabedateien ungefähr so viele Zeilen enthalten. Wenn Sie im Durchschnitt wissen, wie Ihre Komprimierungsrate aussieht, können Sie mit der gleichmäßigen Verteilung von Zeilen auf Ausgabedateien bis zu max_rows konsistente Größen für Ihr Ziel erzielen.
Dies ist einfacher gesagt als getan, wenn Sie eine Partition machen, bevor Sie schreiben. Hier einige Pseudo-Code, wie wir es tun:
-- #3 distribute partitionC's rows based on partitions plus random integer that pertains to file number
select * from dataframe_table as t4
inner join
-- #2 calculate the number of output files per partition
((select t1.partitionA, t1.partitionB, cast(t2.partition_num_rows/max_rows as int) + 1 as partition_num_files from dataframe_table) as t1
inner join
-- #1 determine number of rows in output partition
(select partitionA, partitionB, count(*) as partition_num_rows from dataframe_table group by (partitionA, partitionB)) as t2
on t1.partitionA = t2.partitionA and t1.partitionB = t2.partitionB) as t3
on t3.partitionA = t4.partitionA and t3.partitionB=t4.partitionB
distribute by (t4.partitionA, t4.partitionC, floor(rand() * t3.partition_num_files)) sort by (partitionC, sortfield)
ich eine Art auf die Partition hier enthalten, weil in unserem Anwendungsfall diese drastisch Kompression verbessert, während nur minimal Leistung zu beeinträchtigen.
Und wenn Ihre Ergebnisse aus Schritt 1 und 2 ausreichend klein sind, kann Spark möglicherweise Broadcast beitreten, um sie zu beschleunigen.
Nur neugierig zu wissen, was ist der Anwendungsfall der gleichen Größe in Ausgabedateien. – sachinjain024
Der Versuch, die Dateigröße konsistent zu halten. Wenn ich zum Beispiel Dateien in eine andere Partition schreibe, sind manche Partitionsdateien 10 mal größer. df.repartition (35) .write.mode (SaveMode.Overwrite) .partitionBy (Liste: _ *). Parket ("tmp5") – user447359