Die Signaturfunktion von randomSplit() enthält eine Gewichtungsliste und eine Seed-Spezifikation. Die Gewichtsliste soll die Anzahl der Splits und den Prozentsatz (ungefähr) in jedem angeben, und der Samen dient der Reproduzierbarkeit. Das Verhältnis ist aufgrund der Art seiner Berechnung ungefähr.
Beispielsweise würde der folgende Code in Abbildung 3 df in zwei Datenrahmen aufteilen, wobei train_df 80% und test_df 20% des ursprünglichen Datenrahmens beträgt. Wenn wir denselben Wert für random Seed verwenden, erwarten wir, dass sich dieselben Datenpunkte im selben Split befinden, wenn wir das Skript erneut ausführen oder Spark die Splits intern neu erstellt.
Unter der Haube
Der folgende Vorgang wird wiederholt, um jeden geteilten Datenrahmen zu generieren: Partitionierung, Sortierung innerhalb von Partitionen und Bernoulli-Abtastung. Wenn der ursprüngliche Datenrahmen nicht zwischengespeichert wird, werden die Daten für jede geteilte Berechnung erneut abgerufen, neu partitioniert und neu sortiert. Dies ist die Quelle potenzieller Anomalien. Zusammenfassend ist randomSplit() äquivalent zum Ausführen von sample() für jeden Split, wobei sich der Prozentsatz zum Sample mit dem durchgeführten Split ändert. Dies wird deutlich, wenn Sie den Quellcode für randomSplit() in PySpark3 untersuchen. Dieser Blog⁴ bietet auch einige weitere Informationen und Grafiken zur Implementierung von randomSplit().
Lassen Sie uns ein Beispiel durchgehen. Abbildung 4 zeigt ein Diagramm der Stichprobe () für jeden Split, beginnend mit dem 0,80-Split.