J'ai besoin d'aide. J'utilise Pyspark (je ne peux pas utiliser SQL). J'ai donc une liste de tuples stockés sous forme de paires RDD :
[(('City1', '2020-03-27', 'X1'), 44),
(('City1', '2020-03-28', 'X1'), 44),
(('City3', '2020-03-28', 'X3'), 15),
(('City4', '2020-03-27', 'X4'), 5),
(('City4', '2020-03-26', 'X4'), 4),
(('City2', '2020-03-26', 'X2'), 14),
(('City2', '2020-03-25', 'X2'), 4),
(('City4', '2020-03-25', 'X4'), 1),
(('City1', '2020-03-29', 'X1'), 1),
(('City5', '2020-03-25', 'X5'), 15)]
Avec par exemple ('City5', '2020-03-25', 'X5') comme Clé, et 15 comme valeur de la dernière paire.
Je voudrais obtenir le résultat suivant :
City1, X1, 2020-03-27, 44
City1, X1, 2020-03-28, 44
City5, X3, 2020-03-25, 15
City3, X3, 2020-03-28, 15
City2, X2, 2020-03-26, 14
City4, X4, 2020-03-27, 5
Veuillez noter que le résultat s'affiche :
-
La ou les clés avec la valeur maximale pour chaque ville (c'est la partie la plus difficile, pour afficher la même ville deux fois si elles ont des valeurs maximales similaires à des dates différentes, je suppose qu'on ne peut pas utiliser ReduceByKey() car la clé n'est pas unique, peut-être GroupBy() ou Filter() ?
-
Dans la séquence d'ordre/de tri suivante :
- Valeur maximale décroissante
- Date ascendante
- Nom de la ville en ordre décroissant (ex : City1)
J'ai donc essayé le code suivant :
res = rdd2.map(lambda x: ((x[0][0],x[0][2]), (x[0][1], x[1])))
rdd3 = res.reduceByKey(lambda x1, x2: max(x1, x2, key=lambda x: x[1]))
rdd4 = rdd3.sortBy(lambda a: a[1][1], ascending=False)
rdd5 = rdd4.sortBy(lambda a: a[1][0])
Bien qu'il me donne les villes avec la valeur maximale, il ne renvoie pas deux fois la même ville (parce que réduite par Key : City) si deux villes ont une valeur maximale similaire à deux dates différentes.
J'espère que c'est assez clair, n'hésitez pas à demander des précisions ! Merci beaucoup !