Cuando trabajamos con Apache Spark, es esencial comprender las acciones que podemos realizar sobre los RDDs (Resilient Distributed Datasets). Las acciones son operaciones que se ejecutan de forma inmediata sobre los RDDs, provocando que todas las transformaciones asociadas se lleven a cabo automáticamente. Importante destacar que, a diferencia de las transformaciones, las acciones no modifican los RDDs. Simplemente interactúan con ellos para obtener resultados como mostrar contenido o realizar conteos.
¿Cuáles son algunas de las acciones más comunes?
count: Esta acción cuenta el número de elementos en un RDD determinado. Es particularmente útil para obtener rápidamente el volumen de datos que estamos manejando.
first: Retorna el primer elemento de un RDD. Es una manera efectiva de verificar qué elemento está posicionado al inicio del conjunto de datos.
take: Devuelve una cantidad específica de elementos (definida por el usuario) a partir del comienzo del RDD. Por ejemplo, take(3) retornaría los primeros tres elementos.
Bloque de código de ejemplo en Scala:
val num = sc.parallelize(List(1,2,3,4,5,6,7,8,9,10))val count = num.count()val firstElement = num.first()val firstThree = num.take(3)
¿Cómo se utiliza la acción collect?
collect es otra acción popular en Spark. Esta función reúne todos los elementos de un RDD y los devuelve como una colección en el driver program. Aunque es poderosa, hay que utilizarla con precaución en grandes conjuntos de datos, ya que puede sobrecargar la memoria del driver.
Ejemplo de uso en código:
val allElements = num.collect()
¿Qué otras acciones ofrece Apache Spark?
Además de las acciones mencionadas, Spark ofrece una variedad considerable de opciones para manipular RDDs:
countByKey: Similar a count, pero ofrece un conteo basado en una clave específica.
takeSample: Permite obtener una muestra aleatoria de los elementos del RDD.
saveAsTextFile: Guarda el contenido del RDD en un archivo de texto en un formato particular.
Es recomendable explorar y experimentar con estas acciones para entender completamente sus utilidades y ventajas en diversos escenarios.
¿Cómo poner en práctica los conceptos de acciones y transformaciones?
La mejor manera de aprender es aplicando. Aquí te comparto algunos ejercicios prácticos para que puedas experimentar con lo aprendido:
Creación de RDD: Genera un RDD a partir de una lista que contenga los números del 1 al 10.
Filtrado de elementos pares: Filtra los elementos pares de un RDD.
Valores máximo y mínimo: Encuentra el valor más alto y el más bajo en el RDD.
Cálculo del promedio: Calcula el promedio de los números en el RDD.
Unión de RDDs: Realiza la unión de dos RDDs y observa el resultado.
Estos ejercicios no solo refuerzan el entendimiento de acciones, sino que también proporcionan una práctica valiosa en el manejo de RDDs. ¡Adelante, experimenta y disfruta el proceso de aprendizaje en Databricks o en tu entorno preferido!
Estoy haciendo este curso en el 2026 y seguramente ya estás viendo el Databricks bastante cambiado. Ya no se usa el compute, ahora todo es serverless; el DBFS ya no existe, ahora son Volumes. Databricks está tratando de implementar algo que nombraron: Lake House. Ahora todo está optimizado para que se lea como tablas ordenadas (algo así como un super Snowflake con el poder de Spark) porque incluyeron la parte de Unity Catalog. Todo esto para decir que ya no conviene hacer esos ejercicios con RDDs sino con Dataframes.
crear el dataframe a partir de una lista de números:
lista_nums = list(range(1,10))
df = spark.createDataFrame([(x,) for x in lista_nums], ["numero"])
df.show()
asi como tuplas se pueden asignar mejor el nombre de las columnas. Además el dataframe siempre espera tuplas
elementos pares (e impares):
df_pares = df1.filter(df1.numero % 2 == 0)
df_pares.show()
df_impares = df1.filter(df1.numero % 2 == 1)
df_impares.show()
4. max, min, avg(, sum y count)
df1.agg(
f.max(df1.numero).alias("max"),
f.min(df1.numero).alias("min"),
f.avg(df1.numero).alias("avg"),
f.sum(df1.numero).alias("sum"),
f.count(df1.numero).alias("count")
).show()
o si lo quieres ver mas fancy
display(
df1.agg(
f.max("numero").alias("max"),
f.min("numero").alias("min"),
f.avg("numero").alias("avg"),
f.sum("numero").alias("sum"),
f.count("numero").alias("count")
)
)
Union de dos dataframes. Para eso hay que crear otro DF. Yo lo creé sumándole 1000 a mi df1
entonces ahora a los dataframes no es ncesario aplicarles el
parallelize
??
Mi respuesta a la tarea:
Gracias :)
mi respuesta del reto1:
Mi solucion
Mi solución:
Mi solución gente:
MI tarea:
Gracias Alvaro :) Felicitaciones!
Asi lo resolvi:
Gracias Jose, por tu aportacion :) Siempre suma!
# ejerciciolista_nros = [1,2,3,4,5,6,7,8,9,10]rdd_homework = sc.parallelize(lista_nros)rdd_homework.collect()#print (f'el RRD esta compuesto por: {rdd_homework}')rdd_par = rdd_homework.filter( lambda x : x % 2 == 0) #filtro para obtener los numeros pares.rdd_par.collect()# maximos y minimos rdd_max = rdd_homework.max()rdd_min = rdd_homework.min()print (f'el maximo es {rdd_max} y el minimo es {rdd_min}')rdd_sumavg = rdd_max + rdd_minrdd_avg = rdd_sumavg / 2print(f'el promedio es: {rdd_avg}')# calculando promedio de la lista de numeros con meanrdd_avg = rdd_homework.mean()print(f'el promedio es: {rdd_avg}')# uniendo dos RDDslista_nrostwo = [1,3,5,7,9,11,13,15,17,19,21]rdd_homeworktwo = sc.parallelize(lista_nrostwo)rdd_homeworktwo.collect()rdd_join = rdd_homework.union(rdd_homeworktwo)rdd_join.collect()
Done!
Mis respuestas:
Gracias :)
I am a fan of these exercises
Genial :)
Hola!
Comparto mi solución al reto:
#Create a RDDlist_1_10 =[1,2,3,4,5,6,7,8,9,10]list_rdd = sc.parallelize(list_1_10)list_rdd.collect()#Filter pair values pair_values = list_rdd.filter(lambda x : x %2==0)pair_values.collect()#Find Max and Min in the listdisplay("The max number of the list is:",list_rdd.max(),"The min number of the list is:",list_rdd.min())#Find the average of the listdisplay("The average of the list is:", list_rdd.mean())#Join RDDsjoin_rdd = list_rdd.union(pair_values)join_rdd.collect()```#Create a RDDlist\_1\_10 = \[1,2,3,4,5,6,7,8,9,10]list\_rdd = sc.parallelize(list\_1\_10)list\_rdd.collect()
Tuve que trabajar con DF porque con RDD no me permite con la cuenta free, lo intenté
Ya no es posible crear una cuenta en Community Edition? la free edition no permite trabajar con pyspark ni crear clusters
En los ejercicios propuestos, ¿Cuál es la diferencia entre usar mean o hacer el sum/count?
Ninguna, son dos formas diferentes, una manual y otra a traves de una funcion :) Saludos!
Mis respuestas de los ejercicios:
## 1. Creación de un RDDnewList =[1,2,3,4,5,6,7,8,9,10]newRDD = sc.parallelize(newList)newRDD.collect()# 2. Filtrar los elementos pares de un RDDnewRDD2 = newRDD.filter(lambda x : x%2==0)newRDD2.collect()# 3. Valores máximos y mínimosmax1 = newRDD.max()min1 = newRDD.min()max2 = newRDD2.max()min2 = newRDD2.min()print(f'newRDD max: {max1}, newRDD min: {min1}, newRDD2 max = {max2}, newRDD2 min {min2}')# 4. Promedio de los números en un RDDmean1 = newRDD.mean()mean2 = newRDD2.mean()print(f'newRDD mean: {mean1}, newRDD2 mean: {mean2}')# 5. Unión de dos RDDsnewRDD3 = newRDD.union(newRDD2).collect()print(f'newRDD3: {newRDD3}')