Random-sampling in pyspark mit Ersatz
Ich habe einen dataframe df mit 9000 eindeutige ids.
wie
| id |
1
2
Möchte ich zum generieren einer Zufallsstichprobe mit Ersatz diese 9000-ids 100000 mal.
Wie mache ich es in pyspark
Versuchte ich
df.sample(True,0.5,100)
Aber ich weiß nicht, wie man 100000 Anzahl genaue
- Um klar zu sein, müssen Sie nehmen eine Stichprobe von 9000-ids, wobei jede Probe hat 4.500-ids in es (das wiederholen könnte, da wir eine Probe mit Ersatz), und Sie müssen 100.000 von diesen samples?
- 9000 ist die Bevölkerung von eindeutigen ids, die ich habe, möchte ich oversample der Bevölkerung zu 100000 mit Ersatz und zufällig. also im Klartext, ich soll Sie abholen eine zufällige id 100000 mal aus einer jar-9000-ids in einer zufälligen Weise. Ich hoffe, das hilft.
- Hab es, danke. Ich werde versuchen, es jetzt durch.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Okay, also erste Sachen erste. Sie werden wahrscheinlich nicht in der Lage sein genau das zu bekommen 100.000 in Ihre (über -) Probe. Der Grund warum ist, dass, um zum Beispiel effizient, Spark verwendet so genannte Bernoulli-Sampling. Im Grunde bedeutet dies, es geht Ihnen durch den RDD, und ordnet jeder Zeile eine Wahrscheinlichkeit enthalten. Wenn Sie So wollen, eine 10% - Stichprobe, wird jede Zeile einzeln hat eine 10% chance, aber es nicht berücksichtigt, wenn es ergänzt sich perfekt zu der Zahl, die Sie wollen, aber es neigt dazu, ziemlich in der Nähe für große datasets.
Würde der code wie folgt Aussehen:
df.sample(True, 11.11111, 100)
. Das wird eine Stichprobe des Datensatzes gleich 11.11111 mal die Größe der ursprünglichen dataset. Da 11.11111*9,000 ~= 100,000, erhalten Sie in etwa 100.000 Zeilen.Wenn Sie möchten, eine genaue Probe, die Sie haben zu verwenden
df.takeSample(True, 100000)
. Dies ist jedoch nicht einer verteilten Datensatz. Dieser code wird ein Array zurückgeben (ein sehr großes). Wenn es sein kann, erstellt im Hauptspeicher, dann tun Sie das. Da jedoch benötigen Sie die richtige Anzahl von IDs, die ich don ' T wissen, einen Weg zu tun, die in einer verteilten Weise.