3 votes

Comment obtenir des clés distinctes sous forme de liste à partir d'un RDD dans pyspark ?

Voici un exemple de données transformées en RDD :

my_data = [{'id': '001', 'name': 'Sam', 'class': "classA", 'age': 15, 'exam_score': '90'},
           {'id': '002', 'name': 'Tom', 'class': "classA", 'age': 15, 'exam_score': '78'},
           {'id': '003', 'name': 'Ben', 'class': "classB", 'age': 16, 'exam_score': '91'},
           {'id': '004', 'name': 'Max', 'class': "classB", 'age': 16, 'exam_score': '76'},
           {'id': '005', 'name': 'Ana', 'class': "classA", 'age': 15, 'exam_score': '88'},
           {'id': '006', 'name': 'Ivy', 'class': "classA", 'age': 16, 'exam_score': '77'},
           {'id': '007', 'name': 'Eva', 'class': "classB", 'age': 15, 'exam_score': '86'},
           {'id': '008', 'name': 'Zoe', 'class': "classB", 'age': 16, 'exam_score': '89'}]

my_rdd = sc.parallelize(my_data)

La course à pied my_rdd en tant que tel :

#>>> ParallelCollectionRDD[117] at readRDDFromFile at PythonRDD.scala:274

Et je sais que vous pouvez afficher le RDD avec my_rdd.collect() qui renvoie :

#[{'age': 15,
#  'class': 'classA',
#  'exam_score': '90',
#  'id': '001',
#  'name': 'Sam'},
# {'age': 15,
#  'class': 'classA',
#  'exam_score': '78',
#  'id': '002',
#  'name': 'Tom'}, ...]

J'ai découvert que je pouvais accéder aux clés en exécutant la commande suivante my_rdd.keys() mais cela revient :

#>>> PythonRDD[121] at RDD at PythonRDD.scala:53

Je veux retourner une liste de toutes les clés distinctes (je sais que les clés sont les mêmes pour chaque ligne mais pour un scénario où elles ne le sont pas, j'aimerais le savoir) dans le RDD - donc quelque chose qui ressemble à ceci :

#>>> ['id', 'name', 'class', 'age', 'exam_score']

J'ai donc supposé que je pouvais l'obtenir en exécutant la commande suivante my_rdd.keys().distinct.collect() mais j'obtiens une erreur à la place.

Je suis encore en train d'apprendre pyspark, donc j'apprécierais vraiment que quelqu'un me donne son avis :)

2voto

Linus Points 606
my_data = [{'id': '001', 'name': 'Sam', 'class': "classA", 'age': 15, 'exam_score': '90'},
           {'id': '008', 'name': 'Zoe', 'xxxxx': "classB", 'age': 16, 'exam_score': '89'},
           {'id': '007', 'name': 'Eva', 'class': "classB", 'age': 15, 'exam_score': '86'},
        ]

my_rdd = sc.parallelize(my_data)

key_rdd = my_rdd.flatMap(lambda x: x) # flatMap

print( key_rdd.collect() )
# ['id', 'name', 'class', 'age', 'exam_score', 'id', 'name', 'xxxxx', 'age', 'exam_score', 'id', 'name', 'class', 'age', 'exam_score']
print( key_rdd.distinct().collect() )
# ['class', 'id', 'exam_score', 'age', 'name', 'xxxxx']

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X