Ich möchte nach dem Zufallsprinzip aus einer Scala-Liste oder einem Array (keine RDD) abtasten, die Stichprobengröße kann viel länger sein als die Länge der Liste oder des Arrays, wie kann ich das effizient machen ? Weil die Stichprobengröße sehr groß sein kann und das Sampling (auf verschiedenen Listen / Arrays) sehr oft durchgeführt werden muss.
Ich weiß, dass wir für eine Spark-RDD takeSample () verwenden können, gibt es ein Äquivalent für Scala-Liste / Array?
Vielen Dank.
Für Arrays:
%Vor% Erstelle einen Zufallszahlengenerator ( rnd
) basierend auf deinem Seed. Füllen Sie dann ein Array mit Zufallszahlen von 0 bis zur Größe Ihres Arrays.
Der letzte Schritt besteht darin, jeden zufälligen Wert auf den Indexierungsoperator Ihres Eingabearrays anzuwenden. Die Verwendung in der REPL könnte wie folgt aussehen:
%Vor%Bei Listen würde ich die Liste einfach in Array konvertieren und die gleiche Funktion verwenden. Ich bezweifle, dass du sowieso für Listen viel effizienter werden kannst.
Es ist wichtig zu beachten, dass die gleiche Funktion, die Listen verwendet, O (n ^ 2) Zeit benötigt, während das Konvertieren der Liste in Arrays zuerst O (n) Zeit benötigt
Verwenden Sie zum Verständnis für ein gegebenes Array xs
wie folgt
Beachten Sie, dass der Zufallsgenerator hier Werte innerhalb des Einheitsintervalls erzeugt, die so skaliert sind, dass sie über die Größe des Arrays reichen, und für die Indizierung über das Array in Int
konvertiert werden.
Hinweis Betrachten Sie für rein funktionale Zufallsgeneratoren beispielsweise den State-Monad-Ansatz von Funktionale Programmierung in Scala , hier .
Hinweis Betrachten Sie auch NICTA , einen anderen reinen funktionalen Zufallswertgenerator, dessen Verwendung beispielsweise dargestellt wird < a href="https://stackoverflow.com/a/25655709/3189923"> hier .
Entweder:
SeqHelpers
, zum Beispiel mit einer Scalatest-Spezifikation import your.pkg.SeqHelpers._
Dann sollte folgendes funktionieren:
%Vor%Bearbeitungen zum Entfernen der Besetzung sind willkommen.
Auch wenn es eine Möglichkeit gibt, eine leere Instanz der Sammlung für den Akkumulator zu erstellen, ohne vorher den konkreten Typ zu kennen, kommentieren Sie bitte. Das heißt, der Builder ist wahrscheinlich effizienter.
Tags und Links scala arrays list apache-spark sample