web-dev-qa-db-fra.com

Comment prendre une ligne aléatoire d'un PySpark DataFrame?

Comment puis-je obtenir une ligne aléatoire à partir d'un PySpark DataFrame? Je ne vois que la méthode sample() qui prend une fraction en paramètre. Régler cette fraction sur 1/numberOfRows Conduit à des résultats aléatoires, où parfois je n'obtiendrai aucune ligne.

Sur RRD, il existe une méthode takeSample() qui prend en paramètre le nombre d'éléments que vous souhaitez que l'échantillon contienne. Je comprends que cela pourrait être lent, car vous devez compter chaque partition, mais existe-t-il un moyen d'obtenir quelque chose comme ça sur un DataFrame?

17
DanT

Vous pouvez simplement appeler takeSample sur un RDD:

df = sqlContext.createDataFrame(
    [(1, "a"), (2, "b"), (3, "c"), (4, "d")], ("k", "v"))
df.rdd.takeSample(False, 1, seed=0)
## [Row(k=3, v='c')]

Si vous ne voulez pas collecter, vous pouvez simplement prendre une fraction et une limite plus élevées:

df.sample(False, 0.1, seed=0).limit(1)
44
zero323