site:enseignement:master:bdle:tmes:tme3-scala
Différences
Ci-dessous, les différences entre deux révisions de la page.
| Les deux révisions précédentesRévision précédenteProchaine révision | Révision précédente | ||
| site:enseignement:master:bdle:tmes:tme3-scala [10/10/2017 19:07] – amine | site:enseignement:master:bdle:tmes:tme3-scala [01/10/2018 12:39] (Version actuelle) – amine | ||
|---|---|---|---|
| Ligne 1: | Ligne 1: | ||
| - | {{indexmenu_n> | + | {{indexmenu_n> |
| - | ====== [TME II-1] Introduction à Scala ====== | + | ====== [Pré-requis] Introduction à Scala ====== |
| - | **Remarque générale :** Le cours ne peut être // | + | **Remarque générale :** Le cours ne peut être // |
| - | + | ===== Exercice | |
| - | ===== Exercice | + | |
| Cet exercice illustre les différentes structures de contrôle de Scala présentées en cours. Il permet de comprendre | Cet exercice illustre les différentes structures de contrôle de Scala présentées en cours. Il permet de comprendre | ||
| - | le paradigme fonctionnel. | + | le paradigme fonctionnel |
| + | |||
| + | Lancer le spark-shell en mode local ([[spark|voir Doc]]). | ||
| + | Répondre aux questions ci-dessous. | ||
| ==== Question 1 ==== | ==== Question 1 ==== | ||
| - | Soit une liste de nombres de 1 à 100 construite à l'aide de l'instruction suivante | + | |
| + | * Définir la fonction // | ||
| + | * Définir la fonction // | ||
| + | * Définir la fonction // | ||
| + | |||
| + | Tester au fur et à mesure ces fonctions sur listeEntiers construit comme suit : | ||
| <code scala> | <code scala> | ||
| - | val listeEntiers = List.range(1, | + | val listeEntiers = List.range(1, |
| </ | </ | ||
| - | * Définir la fonction // | ||
| - | * Définir la fonction //moyenne// qui calcule la moyenne des entiers d'une liste fournie en entrée. | ||
| - | * Définir la fonction //maximum// qui retourne le plus grand des entiers d'une liste fournie en entrée. | ||
| - | * Appliquer ces fonctions sur listeEntiers. | ||
| - | <showif isloggedin> | ||
| **Réponse** | **Réponse** | ||
| - | </showif> | + | <code scala> |
| + | def maxEntiers(in: | ||
| + | def scEntiers(in: | ||
| + | def moyEntiers(in: | ||
| + | </ | ||
| ==== Question 2 ==== | ==== Question 2 ==== | ||
| Ligne 28: | Ligne 33: | ||
| val listeTemp = List(" | val listeTemp = List(" | ||
| </ | </ | ||
| - | Chaque élément représente un enregistrement fictif de températures avec le format (station, année, mois, température, | + | Chaque élément représente un enregistrement fictif de températures avec le format (station, année, mois, température, |
| - | * Calculer pour chaque | + | * Calculer pour l'année |
| - | * Calculer | + | * Idem pour la moyenne de ces température. |
| + | |||
| + | Bien entendu, il faudra faire les transformations et les conversions de type nécessaires! | ||
| - | <showif isloggedin> | ||
| **Réponse** | **Réponse** | ||
| - | </showif> | + | <code scala> |
| + | val temp2009 = listeTemp.map(x=> | ||
| + | maxEntiers(temp2009) | ||
| + | moyEntiers(temp2009) | ||
| + | </code> | ||
| Ligne 41: | Ligne 51: | ||
| Soit une liste chaine de caractères construite à l'aide de l' | Soit une liste chaine de caractères construite à l'aide de l' | ||
| <code scala> | <code scala> | ||
| - | val melange = List("u123,f01, | + | val melange = List("1233,100, |
| </ | </ | ||
| Deux types d' | Deux types d' | ||
| (movieID, title, genre). | (movieID, title, genre). | ||
| + | Le domaine des userID est [1000, 2000] et celui des movieID est [0, 100]. | ||
| Il est demandé de construire à partir de //melange// deux listes distinctes : | Il est demandé de construire à partir de //melange// deux listes distinctes : | ||
| - | * //notes// contenant les éléments de la forme (userID, movieID, rating, timestamp) | + | * //notes// contenant les éléments de la forme (userID, movieID, rating, timestamp) |
| - | * //films// contenant les éléments de la forme (movieID, title, genre) et dont le type est (String, String, String). | + | * //films// contenant les éléments de la forme (movieID, title, genre) et dont le type est (Int, String, String). |
| - | <showif isloggedin> | ||
| **Réponse** | **Réponse** | ||
| - | </showif> | + | <code scala> |
| + | val notes = melange.map(_.split("," | ||
| + | val films = melange.map(_.split("," | ||
| + | </ | ||
| ==== Question 4 ==== | ==== Question 4 ==== | ||
| Ligne 78: | Ligne 90: | ||
| - | <showif isloggedin> | ||
| **Réponse** | **Réponse** | ||
| <code scala> | <code scala> | ||
| Ligne 86: | Ligne 97: | ||
| val classes_personnes = personnes.map(x=> | val classes_personnes = personnes.map(x=> | ||
| </ | </ | ||
| - | </ | ||
| - | ===== Exercice | + | ===== Exercice |
| Commencer par copier et décompresser dans votre espace de travail le fichier | Commencer par copier et décompresser dans votre espace de travail le fichier | ||
| Ligne 124: | Ligne 134: | ||
| + | **Réponse** | ||
| + | <code scala> | ||
| + | // | ||
| + | val q1 = data.map(x=> | ||
| - | ===== Exercice subsidiaire ===== | + | // |
| - | ==== Conversion d'un objet List en un objet Map ==== | + | val q2 = q1.filter(x=> x>1000 && x< |
| - | Expliquer l' | + | |
| - | <code scala> | + | |
| - | val x = List((" | + | |
| - | val x = List((22, " | ||
| - | </code> | + | // |
| + | val q33 = q2.filter(x=> | ||
| + | val q39 = q2.filter(x=> | ||
| - | ==== Illustration du flatMap ==== | + | // |
| - | Expliquer la différence entre les expressions | + | val q4 = q33.map(x=> |
| - | <code scala> | + | //5. Construire à partir de q4 un ensemble d’éléments |
| - | val x = List(1, 2, 3).map(x => List(x, 10*x, 100*x) | + | |
| - | val x = List(1, 2, 3).flatMap(x => List(x, 10*x, 100*x)) | + | |
| - | val y = List(List((1, | + | val q5 = q4.distinct |
| - | val y = List(List((1, | + | |
| - | </ | ||
| - | <code scala> | + | //6. Construire à partir de q2 une liste contenant ses qui sont multiples de 3 et de 9 à la fois. Utiliser impérativement q33 et q39. |
| - | val ys = Map(" | + | |
| - | </ | + | |
| - | Attention, le flatMap appliqué sur une Map retourne une Map. Pour garantir l' | + | val q6 = q33.intersection(q39) |
| - | <code scala> | + | |
| - | val ys = Map(" | + | |
| - | </ | + | |
| - | La fonction passée en paramêtre au flatMap doit retourner une séquence. Ici une chaine de caractère est considérée implicitment comme une séquence de caractères. | ||
| - | <code scala> | ||
| - | val pers = Array( (1," | ||
| - | val v = pers.flatMap(x=> | ||
| - | val v = pers.flatMap{ case(numéro, | ||
| + | // | ||
| + | |||
| + | val q7 = q33.subtract(q39) | ||
| + | |||
| + | // | ||
| + | |||
| + | val q8 = q33.union(q2.filter(x=> | ||
| + | |||
| + | // | ||
| + | |||
| + | val q9sum = q8.map(x=> | ||
| + | |||
| + | val q9max = q8.map(x=> | ||
| + | |||
| + | val q9min = q8.map(x=> | ||
| + | |||
| + | val q9avg = q8.map(x=> | ||
| + | |||
| + | q9avg._1/ | ||
| </ | </ | ||
| - | ==== Composition de Map ==== | ||
| - | En considérant la variable pers de la question précédente, | ||
| - | * pers.flatMap(x=> | ||
| - | * pers.flatMap(x=> | ||
| - | * pers.flatMap(x=> | ||
| - | et expliquer pourquoi les deux instructions suivantes sont erronées | ||
| - | * pers.flatMap(x=> | ||
| - | * pers.flatMap(x=> | ||
site/enseignement/master/bdle/tmes/tme3-scala.1507655228.txt.gz · Dernière modification : de amine
