Bewährte MethodenBest practices

In diesem Artikel werden bewährte Methoden bei der Verwendung von Delta Lake beschrieben.This article describes best practices when using Delta Lake.

Angeben von Hinweisen zu DatenspeicherortenProvide data location hints

Wenn Sie davon ausgehen, dass eine Spalte häufig in Abfrage Prädikaten verwendet wird und diese Spalte eine hohe Kardinalität aufweist (d. h. eine große Anzahl unterschiedlicher Werte), verwenden Sie Z-ORDER BY .If you expect a column to be commonly used in query predicates and if that column has high cardinality (that is, a large number of distinct values), then use Z-ORDER BY. Delta Lake legt die Daten in den Dateien automatisch basierend auf den Spaltenwerten fest und verwendet die Layoutinformationen, um beim Abfragen irrelevante Daten zu überspringen.Delta Lake automatically lays out the data in the files based on the column values and use the layout information to skip irrelevant data while querying.

Weitere Informationen finden Sie unter Z-Reihenfolge (mehrdimensionales Clustering).For details, see Z-Ordering (multi-dimensional clustering).

Auswählen der richtigen PartitionsspalteChoose the right partition column

Sie können eine Delta Tabelle durch eine Spalte partitionieren.You can partition a Delta table by a column. Die am häufigsten verwendete partitions Spalte ist date .The most commonly used partition column is date. Befolgen Sie die folgenden beiden Faustregeln, um die zu Partitionierungs Spalte zu bestimmen:Follow these two rules of thumb for deciding on what column to partition by:

  • Wenn die Kardinalität einer Spalte sehr hoch ist, verwenden Sie diese Spalte nicht für die Partitionierung.If the cardinality of a column will be very high, do not use that column for partitioning. Wenn Sie z. b. nach einer Spalte Partitionieren userId und es 1 Mio. unterschiedliche Benutzer-IDs geben kann, handelt es sich dabei um eine schlechte Partitionierungs Strategie.For example, if you partition by a column userId and if there can be 1M distinct user IDs, then that is a bad partitioning strategy.
  • Datenmenge in jeder Partition: Sie können eine Partitionierung anhand einer Spalte durchlaufen, wenn Sie erwarten, dass die Daten in dieser Partition mindestens 1 GB betragen.Amount of data in each partition: You can partition by a column if you expect data in that partition to be at least 1 GB.

Compact-Dateien Compact files

Wenn Sie kontinuierlich Daten in eine Delta Tabelle schreiben, wird eine große Anzahl von Dateien im Laufe der Zeit gesammelt, insbesondere, wenn Sie Daten in kleinen Batches hinzufügen.If you continuously write data to a Delta table, it will over time accumulate a large number of files, especially if you add data in small batches. Dies kann sich negativ auf die Effizienz von Tabellen Lesevorgängen auswirken und kann sich auch auf die Leistung des Dateisystems auswirken.This can have an adverse effect on the efficiency of table reads, and it can also affect the performance of your file system. Idealerweise sollte eine große Anzahl kleiner Dateien in regelmäßigen Abständen in eine kleinere Anzahl größerer Dateien umgeschrieben werden.Ideally, a large number of small files should be rewritten into a smaller number of larger files on a regular basis. Dies wird als "compaction" bezeichnet.This is known as compaction.

Sie können eine Tabelle mit dem Befehl " optimieren " komprimieren.You can compact a table using the OPTIMIZE command.

Ersetzen Sie den Inhalt oder das Schema einer Tabelle. Replace the content or schema of a table

Manchmal möchten Sie möglicherweise eine Delta Tabelle ersetzen.Sometimes you may want to replace a Delta table. Beispiel:For example:

  • Sie ermitteln, dass die Daten in der Tabelle falsch sind und den Inhalt ersetzen sollen.You discover the data in the table is incorrect and want to replace the content.
  • Sie möchten die gesamte Tabelle neu schreiben, um nicht kompatible Schema Änderungen vorzunehmen (Spalten löschen oder Spaltentypen ändern).You want to rewrite the whole table to do incompatible schema changes (drop columns or change column types).

Obwohl Sie das gesamte Verzeichnis einer Delta Tabelle löschen und eine neue Tabelle im gleichen Pfad erstellen können, wird dies aus folgenden Gründen nicht empfohlen :While you can delete the entire directory of a Delta table and create a new table on the same path, it’s not recommended because:

  • Das Löschen eines Verzeichnisses ist nicht effizient.Deleting a directory is not efficient. Das Löschen eines Verzeichnisses mit sehr großen Dateien kann Stunden oder sogar Tage dauern.A directory containing very large files can take hours or even days to delete.
  • Sie verlieren den gesamten Inhalt in den gelöschten Dateien. die Wiederherstellung ist schwierig, wenn Sie die falsche Tabelle löschen.You lose all of content in the deleted files; it’s hard to recover if you delete the wrong table.
  • Das Löschen des Verzeichnisses ist nicht atomarisch.The directory deletion is not atomic. Beim Löschen der Tabelle kann eine gleichzeitige Abfrage, die die Tabelle liest, fehlschlagen oder eine partielle Tabelle sehen.While you are deleting the table a concurrent query reading the table can fail or see a partial table.

Wenn Sie das Tabellen Schema nicht ändern müssen, können Sie Daten aus einer Delta Tabelle Löschen und die neuen Daten einfügen oder die Tabelle Aktualisieren , um die falschen Werte zu beheben.If you don’t need to change the table schema, you can delete data from a Delta table and insert your new data, or update the table to fix the incorrect values.

Wenn Sie das Tabellen Schema ändern möchten, können Sie die gesamte Tabelle atomarisch ersetzen.If you want to change the table schema, you can replace the whole table atomically. Beispiel:For example:

PythonPython

dataframe.write \
  .format("delta") \
  .mode("overwrite") \
  .option("overwriteSchema", "true") \
  .partitionBy(<your-partition-columns>) \
  .saveAsTable("<your-table>") # Managed table
dataframe.write \
  .format("delta") \
  .mode("overwrite") \
  .option("overwriteSchema", "true") \
  .option("path", "<your-table-path>") \
  .partitionBy(<your-partition-columns>) \
  .saveAsTable("<your-table>") # External table

SQLSQL

REPLACE TABLE <your-table> USING DELTA PARTITIONED BY (<your-partition-columns>) AS SELECT ... -- Managed table
REPLACE TABLE <your-table> USING DELTA PARTITIONED BY (<your-partition-columns>) LOCATION "<your-table-path>" AS SELECT ... -- External table

ScalaScala

dataframe.write
  .format("delta")
  .mode("overwrite")
  .option("overwriteSchema", "true")
  .partitionBy(<your-partition-columns>)
  .saveAsTable("<your-table>") // Managed table
dataframe.write
  .format("delta")
  .mode("overwrite")
  .option("overwriteSchema", "true")
  .option("path", "<your-table-path>")
  .partitionBy(<your-partition-columns>)
  .saveAsTable("<your-table>") // External table

Dieser Ansatz bietet mehrere Vorteile:There are multiple benefits with this approach:

  • Das Überschreiben einer Tabelle ist viel schneller, da es nicht erforderlich ist, das Verzeichnis rekursiv aufzulisten oder Dateien zu löschen.Overwriting a table is much faster because it doesn’t need to list the directory recursively or delete any files.
  • Die alte Version der Tabelle ist noch vorhanden.The old version of the table still exists. Wenn Sie die falsche Tabelle löschen, können Sie die alten Daten problemlos mithilfe der Zeit Fahrtabrufen.If you delete the wrong table you can easily retrieve the old data using Time Travel.
  • Es handelt sich um einen atomaren Vorgang.It’s an atomic operation. Gleichzeitige Abfragen können die Tabelle weiterhin lesen, während Sie die Tabelle löschen.Concurrent queries can still read the table while you are deleting the table.
  • Aufgrund der Delta-Acid-Transaktions Garantien wird die Tabelle in Ihrem vorherigen Zustand angezeigt, wenn die Tabelle fehlschlägt.Because of Delta Lake ACID transaction guarantees, if overwriting the table fails, the table will be in its previous state.

Wenn Sie alte Dateien löschen möchten, um Speicherkosten zu sparen, nachdem Sie die Tabelle überschrieben haben, können Sie Sie mit dem Vakuum löschen.In addition, if you want to delete old files to save storage cost after overwriting the table, you can use VACUUM to delete them. Es ist für das Löschen von Dateien und in der Regel schneller als das Löschen des gesamten Verzeichnisses optimiert.It’s optimized for file deletion and usually faster than deleting the entire directory.