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 variablex
representa cada elemento de tu RDD, dondex._2
es el nombre yx._1
es el número. Luego, se aplica la funciónfilter
sobre el RDD original para obtener un nuevo RDD con los datos filtrados. Finalmente, se utilizacollect
yforeach
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 demap
: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 columnaname_parts
que es una matriz con los componentes divididos del nombre. Luego puedes usargetItem
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 objetoRow
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