Dynamisch bestand verwijderen

Wanneer een query een grote Delta Lake-tabel voegt bij een kleinere, gefilterde tabel, zijn de filterwaarden pas bekend als de query wordt uitgevoerd. Zonder runtime pruning scant de query elk bestand in de grote tabel, zelfs bestanden zonder overeenkomende rijen. Dynamisch opschonen van bestanden lost dit probleem op. Tijdens runtime stuurt de optimizer de filterresultaten van één kant van de join naar de scan van de Delta Lake-tabel en slaat bestanden over die geen overeenkomende rijen kunnen bevatten.

Dynamisch bestandspruning is standaard ingeschakeld. Je hoeft je zoekopdrachten niet te veranderen om ervan te profiteren.

Wanneer het opschonen van bestanden wordt toegepast

Dynamische bestandspruning geldt alleen voor joins op Delta Lake-tabellen. In een MERGE-instructie gebruikt het de join-sleutelwaarden van de bron om doelbestanden over te slaan wanneer de mergeconditie een bronkolom vergelijkt met een doelkolom op gelijkheid. In UPDATE en DELETE-instructies is dit van toepassing wanneer de voorwaarde een subquery bevat die hetzelfde soort vergelijking maakt.

Dynamische bestandspruning in de instructies MERGE, UPDATE en DELETE vereist compute met Photon-ondersteuning. Voor SELECT statements heeft Photon bredere en betrouwbaardere dynamische bestandspruning. Zonder Photon kan dynamisch bestandspruning nog steeds van toepassing zijn op SELECT statements, afhankelijk van de queryvorm en het uitvoeringsplan. Zie Wat is Photon?

Dynamische bestandspruning verbetert de prestaties vooral voor niet-gepartitioneerde tabellen en voor joins op niet-gepartitioneerde kolommen. Standaard wordt het alleen geactiveerd wanneer de grote Delta Lake-tabel in de join minstens 10 GB is en minstens 10 bestanden bevat. Zie Configuratie.

Dynamische bestandspruning vermindert ook schrijfconflicten. Wanneer Delta Lake tijdens een commit controleert op conflicten, houdt het rekening met bestanden die door dynamic file pruning zijn overgeslagen. Dit vermindert het aantal mislukte transacties. Zie Isolatieniveaus en schrijfconflicten.

Aanbevolen procedures

Het prestatie-effect van dynamisch bestandssnoeien correleert met hoe data wordt geclusterd. Als de waarden waarop je joint over elk bestand verspreid zijn, slaat dynamische bestandspruning slechts een klein aantal bestanden over. Om ervoor te zorgen dat dynamisch bestandspruning meer bestanden kan overslaan, volg deze werkwijzen:

  • Gebruik liquid clustering op de kolommen waarop je vaak joins uitvoert, zodat bijpassende rijen in minder bestanden bij elkaar worden geplaatst.
  • Gebruik compute met Photon-ondersteuning, waarvoor MERGE, UPDATE en DELETE-statements vereist zijn voor dynamische bestandspruning.

Configuratie

Voor de meeste workloads hoeven deze instellingen niet te worden gewijzigd. Overweeg het afstemmen van de drempels als een join met een kleinere Delta Lake-tabel baat zou hebben bij pruning, maar onder de standaardgrootte of bestandslimiet valt.

Deze configuratie-eigenschappen van Apache Spark regelen dynamische bestandspruning:

Property Type Default Description
spark.databricks.optimizer.dynamicFilePruning Boolean true Schakelt het dynamisch opschonen van bestanden in of uit.
spark.databricks.optimizer.deltaTableSizeThreshold Long 10000000000 (10 GB) De minimale grootte, in bytes, van de grote Delta Lake-tabel in de join die dynamische bestandspruning activeert. Voor een kleinere tabel is het scannen van de hele tabel meestal goedkoper dan filterpushdown toe te passen.
Om de grootte van een Delta Lake-tabel te vinden, voer DESCRIBE DETAIL table_name uit en controleer de sizeInBytes-kolom.
spark.databricks.optimizer.deltaTableFilesThreshold Integer 10 Het minimumaantal bestanden in de grote Delta Lake-tabel in de join dat dynamische bestandspruning activeert. Als de tabel minder bestanden heeft dan deze drempel, wordt dynamische bestandspruning niet uitgevoerd, omdat het misschien niet de moeite waard is voor een tabel met slechts een paar bestanden.
Om het aantal bestanden in een Delta Lake-tabel te vinden, voer DESCRIBE DETAIL table_name uit en controleer de numFiles kolom.