Las operaciones numéricas en RDDs (Resilient Distributed Datasets) son esenciales para procesar y analizar grandes volúmenes de datos de manera eficiente en entornos distribuidos. Aprovechando la flexibilidad y capacidad de escalado de RDDs, es posible obtener información valiosa de datos numéricos. En este caso, nos centraremos en analizar los puntajes de los países que han competido en los Juegos Olímpicos mediante RDDs. Vamos a analizar el proceso, paso a paso, proporcionándote un entendimiento claro de cómo trabajar con estas estructuras de datos.
¿Cómo asignar puntajes a las medallas olímpicas?
Para comenzar nuestro análisis, necesitamos un sistema de puntuación que refleje los logros de los países en los Juegos Olímpicos. La Comisión de los Juegos Olímpicos asigna puntajes en base a las medallas ganadas:
Medallas de oro: 7 puntos
Medallas de plata: 5 puntos
Medallas de bronce: 4 puntos
Estos valores los almacenamos en un diccionario para utilizarlos fácilmente durante los cálculos en nuestro ejercicio.
valores_medallas ={'Oro':7,'Plata':5,'Bronce':4}
¿Cómo extraer y preparar datos de los RDDs?
Una vez definido el sistema de puntuación, el siguiente paso es extraer la información relevante de los RDDs. En nuestro caso, partimos de una estructura de datos que incluye varios valores, y nos interesa centrarnos en el país y el tipo de medalla que ha ganado. Usamos los métodos de manipulación de RDDs para acceder a estos datos.
# Extraer el país y la medalla de la subtuplapais_medalla = rdd.map(lambda x:(x[1][0], x[1][1]))
¿Cómo calcular los puntajes de los países con RDDs?
Para calcular el puntaje total acumulado por cada país, debemos sumar los puntos asignados a cada tipo de medalla. Primero, necesitamos las importaciones necesarias para sumar los valores. Utilizamos métodos de reducción disponibles en Spark.
Reducir por llave (reduceByKey): combina los valores de las mismas claves (en este caso, los países).
Sumar puntos con operator.add: usando la función de sumas de la librería operator.
Finalmente, después de calcular los puntajes, es fundamental presentar la información de manera ordenada para una fácil comprensión. Podemos ordenar los resultados alfabéticamente o por puntaje de manera ascendente o descendente, utilizando sortBy.
# Ordenar los resultados por puntaje en orden descendenteresultado_ordenado = resultado.sortBy(lambda x: x[1], ascending=False)# Mostrar los resultadosfor pais in resultado_ordenado.collect():print(pais)
¿Qué hacer si hay discrepancias en las sumas?
Es posible que encuentres ciertas inconsistencias en los resultados debido a la forma en que se manejan los nombres y siglas de los países en los sistemas de puntuación olímpica. Algunas veces, diferentes equipos del mismo país pueden tener siglas idénticas, lo cual puede llevar a errores en los conteos. Se recomienda explorar y comprender bien los RDDs y considerar posibles soluciones para corregir estos errores.
Continuar aprendiendo sobre RDDs te proporcionará habilidades invaluables para gestionar y analizar grandes conjuntos de datos. Los RDDs son fundamentales en la analítica de datos y te invito a seguir avanzando en tu dominio de estas herramientas.
coincidimos, al parecer el profesor asoció al contrario el join atribuyendo paises a deportistas en vez de deportistas a paises y por eso no coincide con la conclusión.
otro detalle que noto es las diferentes nomenclaturas de los equipos de paises que también puede estar enrredando las cosas
Creo que para comodidad de todos, y poder entender spark. Creo que es importante saber algo de programción funcional. Platzi tiene uno con scala, veanlo para sacarle más provecho es estas clases
Me da el mismo resultado de los que hicieron la modificación en el código:
En una situación de la vida real es importante tener sensibilidad de los números del negocio y hacer una conciliación con alguna cifra conocida, por ejemplo en este caso habría que dudar del resultado, si tenemos el contexto de que Estados Unidos y Rusia han sido punteros siempre en juegos Olímpicos, situación que el resultado del código no refleja.
A mi me dio uno muy parecido jose
Buenas no se si me podrían ayudar hice el arreglo que dijeron en el anterior video sin embargo cuando quiero mostrar los países y sus respectivas puntuaciones me sale igual que al profesor o sea que esta mal
Entiendo que el join de paisesMadellas lo hiciste desde el allRDD y deberías hacerlo desde DeportistasMedallasRDD.
No estoy 100% segura pero probá a ver si puede ser eso...
from pyspark.sql import SparkSession
from operator import add
Crear una instancia de SparkSession
spark = SparkSession.builder
.appName("Mi aplicacion de Spark")
.getOrCreate()
for pais, medallas in resultado_final:
print(pais, medallas)
interesante
Está es la solución que yo hice.
1) Crear primero el RDD:
ganadoresOlimpicos = deportistaOlimpicoRDD.map(lambda l:(l[-1], l[:-1])) \
.join(equiposOlimpicosRDD.map(lambda l:(l[0], l[2]))) \
.map(lambda l:(l[1][0][0],tuple([l[0]]+ l[1][0][1:]+[l[1][1]]))) \
.join(resultadoGanador.map(lambda l:(l[2], l[1])))```2) Crear el diccionario de los puntos:
```python
valores_medallas ={'Gold':7,'Silver':5,'Bronze':4}```3) Crear el RDD con la sumatoria sin necesidad de importar ninguna librería:
```python
paises_medallas = ganadoresOlimpicos\
.map(lambda l:( l[1][0][6], valores_medallas.get(l[1][1],0)))\
.reduceByKey(lambda x, y: x + y)\
.sortBy(lambda x: x[1], ascending=False)```4) Obtener el resultado:
```python
paises_medallas.take(6)
Aca mis resultados.
Aun me sigue costando entender la funcion Lambda-Map-Reduce
Josefina la función map() te permite transformar o aplicar una funcion a un iterable sin necesidad de usar un ciclo. En este caso el iterable sería el RDD (imagínalo como si fuera una lista y estas aplicando una función a cada item de la lista), y la función que se le esta aplicando es una función lambda que hace mas o menos lo que nosotros queramos. En el ejemplo de esta clase permitió ordenar el RDD que ya teniamos seleccionando los elementos del RDD que escogimos. Cómo en la mayoría de los casos de esta clase hemos trabajado con RDDs llave-valores (RDD = (key, (v1,v2)) para poder ver que elemento está en que posición puedes intentar haciendo un take y luego probando las posiciones (listas dentro de listas, tuplas dentro de listas, etc.)
Te recomiendo el curso de Python intermedio, saludos!