Saltar al contenido

Spark DataFrame: seleccione n filas aleatorias

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:

  1. 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.
  2. 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)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *