Solución:
Puede mezclar las filas y luego tomar las de arriba:
import org.apache.spark.sql.functions.rand
dataset.orderBy(rand()).limit(n)
Puede probar el método sample (). Desafortunadamente, no debes dar allí un número, sino una fracción. Puedes escribir una función como esta:
def getRandom (dataset : Dataset[_], n : Int) = {
val count = dataset.count();
val howManyTake = if (count > n) n else count;
dataset.sample(0, 1.0*howManyTake/count).limit (n)
}
Explicación: debemos tomar una fracción de datos. Si tenemos 2000 filas y desea obtener 100 filas, debemos tener 0.5 filas en total. Si desea obtener más filas de las que hay en DataFrame, debe obtener 1.0. Se invoca la función limit () para asegurarse de que el redondeo esté bien y de que no haya obtenido más filas de las que especificó.
Editar: veo en otra respuesta el método takeSample. Pero recuerda:
- Es un método de RDD, no de conjunto de datos, por lo que debe hacer:
dataset.rdd.takeSample(0, 1000, System.currentTimeMilis()).toDF()
takeSample recopilará todos los valores. - Recuerde que si desea obtener muchas filas, tendrá problemas con OutOfMemoryError ya que takeSample está recopilando resultados en el controlador. Úselo con cuidado
Preferiría esto en pyspark
df.sample(withReplacement=False, fraction=desired_fraction)
Aquí está el doc
¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)