0% ont trouvé ce document utile (0 vote)
11 vues27 pages

22061

Ce document contient le compte rendu d'un TP sur Spark. Il présente 5 exercices portant sur l'analyse du fichier RomeoEtJuliette.txt à l'aide d'opérations Spark comme le comptage de lignes et de mots ou le filtrage. Les résultats sont sauvegardés dans des fichiers.

Transféré par

22061
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd
0% ont trouvé ce document utile (0 vote)
11 vues27 pages

22061

Ce document contient le compte rendu d'un TP sur Spark. Il présente 5 exercices portant sur l'analyse du fichier RomeoEtJuliette.txt à l'aide d'opérations Spark comme le comptage de lignes et de mots ou le filtrage. Les résultats sont sauvegardés dans des fichiers.

Transféré par

22061
Copyright
© © All Rights Reserved
Nous prenons très au sérieux les droits relatifs au contenu. Si vous pensez qu’il s’agit de votre contenu, signalez une atteinte au droit d’auteur ici.
Formats disponibles
Téléchargez aux formats PDF, TXT ou lisez en ligne sur Scribd
Vous êtes sur la page 1/ 27

Compte Rendu du TP3 :

22061

Exercice 1 :

Q1/ le nombre de ligne dans le fichier romeoetjuliette.txt est :

from pyspark import *


from pyspark.sql import SparkSession

spark = SparkSession.builder.appName('22061 Spark


Apps').getOrCreate()

sc = spark.sparkContext

print('#################')
print('le nombre de ligne dans le fichier ')
print('**************************')

file_in = sc.textFile('romeoetjuliette.txt')

num_lines = file_in.count()
print('Number of lines in file : {}'.format(num_lines))

num_lines_rdd = sc.parallelize([num_lines])

# Sauvegarder le nombre de lignes


num_lines_rdd.saveAsTextFile("hdfs://192.168.60.50:9000/output/tp
3/22061/exo1/Q1")

print('**************************')
print('**************************')
print('**************************')

print('*** The END ***')


Q2/ le nombre de mot dans le fichier romeoetjuliette.txt :

from pyspark import *


from pyspark.sql import SparkSession
import re

spark = SparkSession.builder.appName('22061 Spark


Apps').getOrCreate()

sc = spark.sparkContext

print('#################')
print('le nombre de ligne dans le fichier ')
print('**************************')

file_in = sc.textFile('romeoetjuliette.txt')

def split_function(line):
words = re.findall(r'\b\w+\b', line)
return words

words = file_in.flatMap(split_function)

num_words = words.count()

print("Nombre de mots dans le fichier:", num_words)

num_words_rdd = sc.parallelize([num_words])
num_words_rdd.saveAsTextFile("output/tp3/22061/exo1/Q2")

print('**************************')
print('**************************')
print('**************************')

print('*** The END ***')

Q3/ :

from pyspark import *


from pyspark.sql import SparkSession
import re

spark = SparkSession.builder.appName('22061 Spark


Apps').getOrCreate()

sc = spark.sparkContext
print('#################')
print('le nombre de ligne dans le fichier ')
print('**************************')

# Charger le fichier texte dans un RDD


file_in = sc.textFile('romeoetjuliette.txt')

# Filtrer les lignes qui commencent par le nom "Romeo"


lines_with_romeo = file_in.filter(lambda line:
line.startswith("Romeo"))

# Compter le nombre de répliques de Romeo


num_lines_with_romeo = lines_with_romeo.count()

# Afficher le nombre de répliques de Romeo


print("Nombre de répliques de Romeo dans la pièce:",
num_lines_with_romeo)

num_lines_with_romeo_rdd = sc.parallelize([num_lines_with_romeo])

num_lines_with_romeo_rdd.saveAsTextFile("output/tp3/22061/exo1/Q3
")

print('**************************')
print('**************************')
print('**************************')

print('*** The END ***')


Q4/ :

from pyspark import *


from pyspark.sql import SparkSession
import re

spark = SparkSession.builder.appName('22061 Spark


Apps').getOrCreate()

sc = spark.sparkContext

print('#################')

print('**************************')

file_in = sc.textFile('romeoetjuliette.txt')

# Diviser chaque ligne en mots et filtrer pour ne garder que


"Mantua"
word_mantua_count = file_in.flatMap(lambda line: line.split()) \
.filter(lambda word: word == "Mantua")
\
.count()

# Afficher le nombre d'occurrences de "Mantua"


print("Nombre d'occurrences de 'Mantua' dans la pièce:",
word_mantua_count)

# Créer un RDD à partir du comptage pour pouvoir l'enregistrer


word_mantua_rdd = sc.parallelize([("Nombre d'occurrences de
'Mantua'", word_mantua_count)])

# Enregistrer le résultat dans un fichier texte


word_mantua_rdd.saveAsTextFile("output/tp3/22061/exo1/Q4")

print('**************************')
print('**************************')
print('**************************')

print('*** The END ***')


Q5 :

from pyspark import *


from pyspark.sql import SparkSession

# Initialiser la session Spark


spark = SparkSession.builder.appName('22061 Spark
Apps').getOrCreate()

# Obtenir le contexte Spark


sc = spark.sparkContext

print('#################')
print('Affichage des 10 premiers éléments avec numéro de ligne')

# Charger le fichier texte dans un RDD


file_in = sc.textFile('romeoetjuliette.txt')

# Créer un RDD contenant un tuple (numéro de ligne, contenu de la


ligne)
# en utilisant la fonction zipWithIndex()
rdd_with_index = file_in.zipWithIndex().map(lambda x: (x[1] + 1,
x[0])) # Ajouter 1 pour obtenir un numéro de ligne commençant à
1

# Afficher les 10 premiers éléments dans la console


for line_number, line_content in rdd_with_index.take(10):
print(f"Line {line_number}: {line_content}")

# Sauvegarder les 10 premiers éléments dans un fichier de sortie


sc.parallelize(rdd_with_index.take(10)) \
.map(lambda x: f"Line {x[0]}: {x[1]}") \
.saveAsTextFile("output/tp3/22061/exo1/Q5")
print('**************************')
print('**************************')
print('**************************')

print('*** The END ***')

Exercice 2 :

Q1 :

from pyspark import SparkContext

# Créer le contexte Spark


sc = SparkContext("local", "Exercise2")

print ("debut du programme ")


print("*******************")
print("###################")

print ("le sauvegarde a ete fait avec succes ")


# Définir la fonction pour séparer les éléments
def sep_fun(x):
return x.split('::')

# Charger les fichiers dans les RDDs


movies_rdd = sc.textFile("movies.dat") \
.map(sep_fun)
ratings_rdd = sc.textFile("ratings.dat") \
.map(sep_fun)
users_rdd = sc.textFile("users.dat") \
.map(sep_fun)

# Prendre les 5 premiers éléments de chaque RDD et les mettre


dans une liste
movies_first_5 = movies_rdd.take(5)
ratings_first_5 = ratings_rdd.take(5)
users_first_5 = users_rdd.take(5)

# Créer une liste contenant les listes des 5 premiers éléments de


chaque RDD
output_list = [movies_first_5, ratings_first_5, users_first_5]

# Convertir la liste en RDD


output_rdd = sc.parallelize(output_list)

# Écrire les 5 premiers éléments de chaque RDD dans le dossier de


sortie
output_rdd.saveAsTextFile("output/tp3/22061/exo2/Q1")

print ("le sauvegarde a ete fait avec succes ")

print('**************************')
print('**************************')
print('**************************')

print('*** The END ***')


Q2/ :

from pyspark import SparkContext


from pyspark.sql import SparkSession

# Créer le contexte Spark


sc = SparkContext("local", "Exercise2")

# Charger les fichiers dans les RDDs


movies_rdd = sc.textFile("movies.dat").map(lambda x:
x.split('::'))
ratings_rdd = sc.textFile("ratings.dat").map(lambda x:
x.split('::'))
users_rdd = sc.textFile("users.dat").map(lambda x: x.split('::'))

# Compter le nombre de lignes dans chaque RDD


movies_count = movies_rdd.count()
ratings_count = ratings_rdd.count()
users_count = users_rdd.count()

# Afficher le nombre de lignes pour chaque RDD


print("Nombre de lignes dans movies_rdd:", movies_count)
print("Nombre de lignes dans ratings_rdd:", ratings_count)
print("Nombre de lignes dans users_rdd:", users_count)
movies_count_str = str(movies_count)
ratings_count_str = str(ratings_count)
users_count_str = str(users_count)

# Créer un RDD contenant tous les comptages


counts_rdd = sc.parallelize([
("Nombre de lignes dans movies_rdd", movies_count_str),
("Nombre de lignes dans ratings_rdd", ratings_count_str),
("Nombre de lignes dans users_rdd", users_count_str)
])

counts_rdd.saveAsTextFile("output/tp3/22061/exo2/Q2")

print('**************************')
print('**************************')
print('**************************')

print('*** The END ***')


Q3 :

from pyspark import SparkContext

# Créer le contexte Spark


sc = SparkContext("local", "Exercise3_Q3")

print('*** The BEGINING ***')


print('**************************')
print('**************************')
print('**************************')

# Charger le fichier ratings.dat dans un RDD


ratings_rdd = sc.textFile("ratings.dat")

# Filtrer les lignes pour ne garder que celles avec la note '1'
et compter leur nombre
rating_1_count = ratings_rdd.filter(lambda line:
line.split("::")[2] == '1').count()

# Afficher le nombre de fois que la note '1' a été donnée


print("Le nombre de fois que la note '1' a été donnée :",
rating_1_count)
rating_1_count_rdd = sc.parallelize(["Nombre d'occurrences de
'Mantua'", rating_1_count])
rating_1_count_rdd.saveAsTextFile("output/tp3/22061/exo2/Q3")
print("le sauvegarde a ete fait avec succes")

print('**************************')
print('**************************')
print('**************************')

print('*** The END ***')


Q4/ :

from pyspark import SparkContext

# Créer le contexte Spark


sc = SparkContext("local", "Exercise2_Q4")

# Charger les fichiers dans les RDDs


ratings_rdd = sc.textFile("ratings.dat") \
.map(lambda line: line.split('::')[1]) \
.distinct()

# Compter le nombre de films uniques


unique_movies_count = ratings_rdd.count()

# Afficher le résultat
print("Nombre de films uniques évalués :", unique_movies_count)

unique_movies_count_rdd = sc.parallelize([("Nombre de lignes dans


movies_rdd", unique_movies_count)])

unique_movies_count_rdd.saveAsTextFile("output/tp3/22061/exo2/Q4"
)

print('**************************')
print('**************************')
print('**************************')

print('*** The END ***')


Q5/ :

from pyspark import SparkContext

# Créer le contexte Spark


sc = SparkContext("local", "Exercise2_Q5")

print('*** The BEGINING ***')


print('**************************')
print('**************************')
print('**************************')

# Charger les fichiers dans les RDDs


ratings_rdd = sc.textFile("ratings.dat") \
.map(lambda line: (line.split('::')[0], 1)) \
.reduceByKey(lambda a, b: a + b)

# Trouver l'utilisateur avec le plus grand nombre d'évaluations


max_user = ratings_rdd.max(lambda x: x[1])

# Afficher l'ID utilisateur et le nombre d'évaluations


print("Utilisateur avec le plus grand nombre d'évaluations :")
print("User ID:", max_user[0])
print("Nombre d'évaluations:", max_user[1])

results_rdd = sc.parallelize([
f"User ID: : {max_user[0]}",
f"Nombre d'évaluations: : {max_user[1]}"
])

results_rdd.saveAsTextFile("output/tp3/22061/exo2/Q5")

print('**************************')
print('**************************')
print('**************************')
print('*** The END ***')

Q6/ :

from pyspark import SparkContext

# Créer le contexte Spark


sc = SparkContext("local", "Exercise2_Q6")

# Charger les fichiers dans les RDDs


ratings_rdd = sc.textFile("ratings.dat") \
.map(lambda line: (line.split('::')[0], 1 if
line.split('::')[2] == '5' else 0)) \
.reduceByKey(lambda a, b: a + b)

# Trouver l'utilisateur avec le plus grand nombre de notes "5"


max_user_5 = ratings_rdd.max(lambda x: x[1])

# Afficher l'ID utilisateur et le nombre de notes "5"


print("Utilisateur avec le plus grand nombre de notes '5' :")
print("User ID:", max_user_5[0])
print("Nombre de notes '5':", max_user_5[1])

results_rdd = sc.parallelize([
f"User ID: : {max_user_5[0]}",
f"Nombre de notes '5' : {max_user_5[1]}"
])
results_rdd.saveAsTextFile("output/tp3/22061/exo2/Q6")

print('**************************')
print('**************************')
print('**************************')

print('*** The END ***')

Q7/ :

from pyspark import SparkContext

# Créer le contexte Spark


sc = SparkContext("local", "Exercise2_Q7")

print('*** The BEGINING ***')


print('**************************')
print('**************************')
print('**************************')

# Charger les fichiers dans les RDDs


ratings_rdd = sc.textFile("ratings.dat") \
.map(lambda line: (line.split('::')[1], 1)) \
.reduceByKey(lambda a, b: a + b)
# Trouver le film le plus souvent noté
max_movie = ratings_rdd.max(lambda x: x[1])

# Afficher le movieID et le nombre d'évaluations


print("Film le plus souvent noté :")
print("Movie ID:", max_movie[0])
print("Nombre d'évaluations:", max_movie[1])

results_rdd = sc.parallelize([
"Film le plus souvent noté :",
f"User ID: : {max_movie[0]}",
f"Nombre de notes '5' : {max_movie[1]}"
])

results_rdd.saveAsTextFile("output/tp3/22061/exo2/Q7")

print('**************************')
print('**************************')
print('**************************')

print('*** The END ***')


Q8:/

from pyspark import SparkContext

# Créer le contexte Spark


sc = SparkContext("local", "Exercise2_Q8")

print('*** The BEGINING ***')


print('**************************')
print('**************************')
print('**************************')

# Charger les fichiers dans les RDDs


movies_rdd = sc.textFile("movies.dat") \
.map(lambda line: (line.split('::')[0],
line.split('::')[2])) \
.filter(lambda movie: 'Comedy' in movie[1])

# Compter le nombre de films qui sont des comédies


comedy_movies_count = movies_rdd.count()

# Afficher le résultat
print("Nombre de films qui sont des comédies :",
comedy_movies_count)

results_rdd = sc.parallelize([
f"ombre de films qui sont des comédies : {comedy_movies_count}"
])

results_rdd.saveAsTextFile("output/tp3/22061/exo2/Q8")

print('**************************')
print('**************************')
print('**************************')

print('*** The END ***')


Q9/ :

from pyspark import SparkContext

# Créer le contexte Spark


sc = SparkContext("local", "Exercise2_Q9")

print('*** The BEGINING ***')


print('**************************')
print('**************************')
print('**************************')

# Charger les fichiers dans les RDDs


movies_rdd = sc.textFile("movies.dat") \
.map(lambda line: (line.split('::')[0],
line.split('::')[1]))

ratings_rdd = sc.textFile("ratings.dat") \
.map(lambda line: (line.split('::')[1], 1)) \
.reduceByKey(lambda a, b: a + b)

# Joindre les RDDs sur movieID


joined_rdd = movies_rdd.join(ratings_rdd)

# Filtrer les comédies et trouver celle avec le plus


d'évaluations
max_comedy = joined_rdd.filter(lambda x: 'Comedy' in x[1][0]) \
.max(lambda x: x[1][1])

# Afficher le titre de la comédie et le nombre d'évaluations


print("Comédie avec le plus d'évaluations :")
print("Titre:", max_comedy[1][0])
print("Nombre d'évaluations:", max_comedy[1][1])

results_rdd = sc.parallelize([
"Comédie avec le plus d'évaluations :",
f"Titre : {max_comedy[1][0]}",
f"Nombre d'évaluations : {max_comedy[1][1]}"
])

results_rdd.saveAsTextFile("output/tp3/22061/exo2/Q9")

print('**************************')
print('**************************')
print('**************************')

print('*** The END ***')


Exercice 3 :

Q1/ :

from pyspark import SparkContext

# Créer le contexte Spark


sc = SparkContext("local", "Exercise3_Q1")

print('*** The BEGINING ***')


print('**************************')
print('**************************')

# Charger le fichier dans un RDD


stations_rdd = sc.textFile("isd-history.txt")

# Filtrer les lignes contenant des en-têtes


header = stations_rdd.first()
stations_rdd = stations_rdd.filter(lambda line: line != header)

# Fonction pour déterminer l'hémisphère en fonction de la


latitude

def hemisphere(latitude):
latitude = latitude.strip('"') # Supprimer les guillemets
entourant la latitude
if latitude: # Vérifier si la latitude n'est pas vide après
suppression des guillemets
latitude = float(latitude) # Convertir en flottant
if latitude >= 0:
return "Northern Hemisphere"
else:
return "Southern Hemisphere"
else:
return "Invalid Latitude"
# Mapper chaque ligne à l'hémisphère correspondant
hemisphere_count_rdd = stations_rdd.map(lambda line:
(hemisphere(line.split(',')[6]), 1))

# Réduire pour compter le nombre de stations dans chaque


hémisphère
hemisphere_counts = hemisphere_count_rdd.reduceByKey(lambda a, b:
a + b).collect()

# Afficher les résultats


print("Nombre de stations dans l'hémisphère nord et dans
l'hémisphère sud :")
for hemisphere, count in hemisphere_counts:
print(hemisphere, ":", count)

# Sauvegarder les résultats


results_rdd = sc.parallelize([
"Nombre de stations dans l'hémisphère nord et dans
l'hémisphère sud :"
])
for hemisphere, count in hemisphere_counts:
results_rdd =
results_rdd.union(sc.parallelize([f"{hemisphere}: {count}"]))

results_rdd.saveAsTextFile("output/tp3/22061/exo3/Q1")

print('**************************')
print('**************************')
print('**************************')

print('*** The END ***')

Q2/ :

from pyspark import SparkContext

# Créer le contexte Spark


sc = SparkContext("local", "Exercise3_Q2")

print('*** The BEGINING ***')


print('**************************')
print('**************************')
print('**************************')

# Charger le fichier dans un RDD


stations_rdd = sc.textFile("isd-history.txt")

# Filtrer les lignes contenant des valeurs non numériques pour


les années
def is_valid_year(year):
return year.isdigit()

# Filtrer les lignes contenant des années valides


filtered_rdd = stations_rdd.filter(lambda line:
is_valid_year(line.split(',')[9]) and
is_valid_year(line.split(',')[10]))

# Vérifier si l'RDD filtré est vide


if filtered_rdd.isEmpty():
print("Aucune donnée valide trouvée dans le RDD.")
else:
station_with_max_years_diff = filtered_rdd.map(lambda line:
(line.split(',')[0], (int(line.split(',')[9]),
int(line.split(',')[10])))) \
.map(lambda x:
(x[0], abs(x[1][1] - x[1][0]))) \
.max(lambda x:
x[1])

# Afficher les résultats


print("Station avec le plus grand écart d'années :")
print("Identifiant de la station :",
station_with_max_years_diff[0].strip())
print("Nom de la station :",
station_with_max_years_diff[0].strip())

results_rdd = sc.parallelize([
"Station avec le plus grand écart d'années :",
f"Identifiant de la station :
{station_with_max_years_diff[0].strip()}",
f"Nom de la station :
{station_with_max_years_diff[0].strip()}"
])

results_rdd.saveAsTextFile("output/tp3/22061/exo3/Q2")

print('**************************')
print('**************************')
print('**************************')

print('*** The END ***')


Q3/ :

from pyspark import SparkContext

# Créer le contexte Spark


sc = SparkContext("local", "Exercise3_Q3")

# Charger le fichier dans un RDD


stations_rdd = sc.textFile("isd-history.txt")

# Filtrer les lignes contenant des en-têtes


header = stations_rdd.first()
stations_rdd = stations_rdd.filter(lambda line: line != header)

# Mapper chaque ligne pour extraire le pays


stations_by_country = stations_rdd.map(lambda line:
(line.split(',')[3], 1))

# Réduire pour compter le nombre de stations par pays


stations_count_by_country =
stations_by_country.reduceByKey(lambda x, y: x + y)

# Trouver le pays avec le plus grand nombre de stations


country_with_most_stations = stations_count_by_country.max(lambda
x: x[1])

# Afficher le résultat
print("Le pays avec le plus de stations est :",
country_with_most_stations[0])
print("Nombre de stations :", country_with_most_stations[1])
# Sauvegarder les résultats
results_rdd = sc.parallelize([
f"Le pays avec le plus de stations est :
{country_with_most_stations[0]}",
f"Nombre de stations : {country_with_most_stations[1]}"
])

results_rdd.saveAsTextFile("output/tp3/22061/exo3/Q3")

print('**************************')
print('**************************')
print('**************************')

print('*** The END ***')

Q4/ :

from pyspark import SparkContext

# Créer le contexte Spark


sc = SparkContext("local", "Exercise3_Q4")

# Charger le fichier dans un RDD


stations_rdd = sc.textFile("isd-history.txt")
# Filtrer les lignes contenant des en-têtes
header = stations_rdd.first()
stations_rdd = stations_rdd.filter(lambda line: line != header)

# Mapper chaque ligne pour extraire le pays


countries_rdd = stations_rdd.map(lambda line: line.split(',')[3])

# Supprimer les doublons pour obtenir une liste unique de pays


unique_countries_rdd = countries_rdd.distinct()

# Compter le nombre de pays


num_countries_with_stations = unique_countries_rdd.count()

# Afficher le résultat
print("Le nombre de pays possédant des stations météo est :",
num_countries_with_stations)

# Sauvegarder les résultats


results_rdd = sc.parallelize([
f"Le nombre de pays possédant des stations météo est :
{num_countries_with_stations}"
])

results_rdd.saveAsTextFile("output/tp3/22061/exo3/Q4")

print('**************************')
print('**************************')
print('**************************')

print('*** The END ***')


Q5/ :

from pyspark import SparkContext

# Créer le contexte Spark


sc = SparkContext("local", "Exercise3_Q5")

print('*** The BEGINING ***')


print('**************************')
print('**************************')
print('**************************')

# Charger le fichier dans un RDD


stations_rdd = sc.textFile("isd-history.txt")

# Filtrer les lignes contenant des en-têtes


header = stations_rdd.first()
stations_rdd = stations_rdd.filter(lambda line: line != header)

# Filtrer les lignes correspondant à la Mauritanie


stations_in_mauritania_rdd = stations_rdd.filter(lambda line:
line.split(',')[3] == "Mauritania")

# Compter le nombre de stations en Mauritanie


num_stations_in_mauritania = stations_in_mauritania_rdd.count()

# Afficher le résultat
print("Le nombre de stations météo en Mauritanie est :",
num_stations_in_mauritania)

# Sauvegarder les résultats


results_rdd = sc.parallelize([
f"Le nombre de stations météo en Mauritanie est :
{num_stations_in_mauritania}"
])

results_rdd.saveAsTextFile("output/tp3/22061/exo3/Q5")

print('**************************')
print('**************************')
print('**************************')

print('*** The END ***')

Vous aimerez peut-être aussi