Ma base de données d'étudiants a plusieurs enregistrements pour chaque élève de l'étudiant de la table.
Je lisez les données dans une source de données Spark, puis itérale à travers une source de données d'étincelle, isolez des enregistrements pour chaque élève et faites un certain traitement pour chaque dossier de l'étudiant. . P>
Mon code jusqu'à présent: P>
from pyspark.sql import SparkSession spark_session = SparkSession \ .builder \ .appName("app") \ .config("spark.jars.packages", "org.apache.hadoop:hadoop-aws:2.7.2") \ .getOrCreate() class_3A = spark_session.sql("SQL") for row in class_3A: #for each student #Print Name, Age and Subject Marks
4 Réponses :
Vous pouvez faire boucler chaque enregistrement dans un fichier de données et y accéder avec les noms de colonne
+---+--------+ |age|name | +---+--------+ |25 |Ankit | |22 |Jalfaizy| |20 |Suresh | |26 |Bala | +---+--------+ Hi Ankit your age is : 25 Hi Jalfaizy your age is : 22 Hi Suresh your age is : 20 Hi Bala your age is : 26
Pas le moyen le plus efficace d'utiliser une étincelle. Vous téléchargez des données sur un fichier de données uniquement pour le collecter et traiter avec la boucle Python? Cela n'a aucun sens.
Une autre approche serait d'utiliser SparkSQL
>>> df = spark.createDataFrame([('Ankit',25),('Jalfaizy',22),('Suresh',20),('Bala',26)],['name','age']) >>> df.show() +--------+---+ | name|age| +--------+---+ | Ankit| 25| |Jalfaizy| 22| | Suresh| 20| | Bala| 26| +--------+---+ >>> df.where('age > 20').show() +--------+---+ | name|age| +--------+---+ | Ankit| 25| |Jalfaizy| 22| | Bala| 26| +--------+---+ >>> from pyspark.sql.functions import * >>> df.select('name', col('age') + 100).show() +--------+-----------+ | name|(age + 100)| +--------+-----------+ | Ankit| 125| |Jalfaizy| 122| | Suresh| 120| | Bala| 126| +--------+-----------+
Approche impérative (en plus de l'approche SQL de Bala):
class_3A = spark_session.sql("SQL") def process_student(student_row): # Do Something with student_row return processed_student_row #"isolate records for each student" # Each student record will be passed to process_student function for processing. # Results will be accumulated to a new DF - result_df result_df = class_3A.map(process_student) # If you don't care about results and just want to do some processing: class_3A.foreach(process_student)
Je ne sais pas si je comprends la question de la question, mais si vous voulez faire l'opération sur
Des lignes basées sur n'importe quelle colonne que vous pouvez le faire en utilisant des fonctions de Dataframe. Exemple: échantillon de données p> étudiant_id, sujet, marques
1, maths, 3
1, Science, 6
2, maths, 4
2, science, 7 p> sortie p> + ---------- + ------- + ----- +
| Student_id | Sujet | Marks |
+ ----------- + ------- + ----- +
| 1 | Maths | 3 |
| 1 | Science | 6 |
| 2 | Maths | 4 |
| 2 | Science | 7 |
+ ---------- + ------- + ----- + P> + ---------- + ----- - + ------ + ------------------- + +
| Student_ID | Sujet | Marks | Max_Marks_inaNysub |
+ ----------- + ------- + ----- + ------------------- + + +
| 1 | Science | 6 | 6 |
| 2 | Science | 7 | 7 |
+ ---------- + ------- + ----- + ------------------- + P> < / p>
Avez-vous encore essayé quelque chose? Il serait utile de donner plus de contexte à ce que vous essayez d'accomplir. "Isoler" et "processus" est assez vague.
Merci tout le monde. Je pense que je voulais avoir la flexibilité du cadre de données Pandas afin que j'ai convertit la structure de données d'étincelle en une trame de données Pandas.