Cómo filtrar después de dividir() en rdd chispa scala?

1,John,NY
2,Bill,FL
3,Harry,TX

Tengo un archivo de texto con datos anteriores.

val rdd = sc.textFile("/path").map(x=>(x.split(",")(0).toInt,x.split(",")(1),x.split(",")(2)))

Después de esto, ¿cómo puedo filtrar los datos donde el nombre es Bill o número es ? ¿2? ¿O hay otra manera de hacerlo sin función dividida?

Pregunta hecha hace 3 años, 4 meses, 29 días - Por algorithmwizard


3 Respuestas:

  • Uso filter función.

    df
    .map(x=>(x.split(",")(0).toInt,x.split(",")(1),x.split(",")(2)))
    .filter(row => row._2 == "Bill" || row._1 > 2)
    

    Respondida el Dec 17, 2020 a las 03:14 - por debugdynamo05ee

    Votos positivos: 0 | Votos negativos: 0

  • Para filtrar los datos después de realizar la operación split en un RDD en Spark Scala, puedes utilizar la función filter junto con una función lambda que realice la condición de filtrado. Aquí te muestro un ejemplo de cómo filtrar los datos donde el nombre sea "Bill" o el número sea igual a 2 en tu RDD:

    scala
    val rdd = sc.textFile("/path").map(x=>(x.split(",")(0).toInt,x.split(",")(1),x.split(",")(2)))
    
    // Filtrar los datos donde el nombre es "Bill" o el número es igual a 2
    val filteredRdd = rdd.filter(x => x._2 == "Bill" || x._1 == 2)
    
    filteredRdd.collect().foreach(println)
    

    En este código, la función lambda x => x._2 == "Bill" || x._1 == 2 se encarga de realizar la condición de filtrado. La variable x representa cada elemento de tu RDD, donde x._2 es el nombre y x._1 es el número. Luego, se aplica la función filter sobre el RDD original para obtener un nuevo RDD con los datos filtrados. Finalmente, se utiliza collect y foreach para imprimir el resultado.

    Espero que esta información te sea de ayuda. ¡Déjame saber si tienes alguna otra pregunta!

    Respondida el Dec 18, 2020 a las 03:10 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • Usando la función filter después de map:

    scala
    val filteredRDD = rdd.filter(t => t._2 == "Bill" || t._1 == 2)
    

    Esta línea filtra el RDD para mantener solo las filas donde el segundo campo (nombre) es igual a "Bill" o el primer campo (número) es igual a 2.

    Usando la función split de DataFrames:

    Puedes convertir tu RDD a un DataFrame y usar la función split de DataFrames para dividir la columna en múltiples columnas:

    scala
    import org.apache.spark.sql.functions._
    
    val df = rdd.toDF("id", "name", "state")
    
    val splitDF = df.withColumn("name_parts", split($"name", ","))
    
    val filteredDF = splitDF.filter(splitDF("name_parts").getItem(0) === "Bill" || splitDF("name_parts").getItem(1) === "2")
    

    La función split crea una nueva columna name_parts que es una matriz con los componentes divididos del nombre. Luego puedes usar getItem para acceder a elementos específicos de la matriz y filtrar en consecuencia.

    Alternativa sin usar split:

    Si conoces la posición de los datos que deseas extraer, puedes usar el método getField del objeto Row directamente:

    scala
    val filteredRDD = rdd.filter(r => r.getString(1) == "Bill" || r.getInt(0) == 2)
    

    Esto asume que el nombre es el campo 1 y el número es el campo 0 en la fila.

    Respondida el Dec 18, 2020 a las 03:17 - por Gemini

    Votos positivos: 0 | Votos negativos: 0