Bases de Données / Databases

Site Web de l'équipe BD du LIP6 / LIP6 DB Web Site

Outils pour utilisateurs

Outils du site


site:enseignement:master:bdle:tmes:tmejointure

Différences

Ci-dessous, les différences entre deux révisions de la page.

Lien vers cette vue comparative

Les deux révisions précédentesRévision précédente
Prochaine révision
Révision précédente
site:enseignement:master:bdle:tmes:tmejointure [30/11/2018 14:49] – [Exercice 2 : Equi-jointure parallèle et répartie] hubertsite:enseignement:master:bdle:tmes:tmejointure [14/12/2018 16:18] (Version actuelle) – [Exercice 6 : Chemin le plus long] hubert
Ligne 99: Ligne 99:
   return List(s.toString()).iterator   return List(s.toString()).iterator
 } }
 +
 + def affichePartitions[T: ClassTag](d: Dataset[T]): Unit = d.rdd.mapPartitionsWithIndex(entete).collect.foreach(println)
 +
  
 // Déterminer le nombre d'éléments contenus dans chaque partition // Déterminer le nombre d'éléments contenus dans chaque partition
Ligne 110: Ligne 113:
  
  
-// Supprimer les données persistant en mémoire +// Supprimer les collections persistant en mémoire 
-def cleanStorage() = { +  def clearStorage() = { 
-    val nbCol = spark.sparkContext.getPersistentRDDs.size +    spark.catalog.clearCache()
-    spark.sparkContext.getPersistentRDDs.values.foreach(x => x.unpersist()) +
-    println(s"$nbCol collections removed")+
   }   }
  
Ligne 377: Ligne 378:
 ) )
  
-val sport2 = sc.parallelize(sport1, 4).map(s=> s.split(" ")).map(t => Triplet(t(0), t(1), t(2)))+val sport2 = spark.sparkContext.parallelize(sport1, 4).map(s=> s.split(" ")).map(t => Triplet(t(0), t(1), t(2)))
  
 // afficher les partitions // afficher les partitions
Ligne 452: Ligne 453:
  
 </code> </code>
-Afficher un extrait des données pour les acteurs (les personnes dont le sujet contient actor ou actressou pour le sujet Sheela :+Afficher un extrait des données pour les sprinter (les personnes dont le sujet contient sprinter) :
 <code scala> <code scala>
-val yagoActors = yago.where("sujet like '%(act%)>' ") +  val yagoSprinter = yago.where("sujet like '%(sprinter)%'"
-affichePartitions(yagoActors) +  affichePartitions(yagoSprinter)
-val innocent = yago.where("sujet = '<Innocent_(actor)>' ") +
-affichePartitions(innocent)+
 </code> </code>
  
-Est-ce que tous les triplets au sujet de l'acteur //Innocent// sont dans la même partition ? +Est-ce que tous les triplets au sujet du sprinter Percy_Williams sont dans la même partition ?  
 +Combien de partitions faut-il lire pour trouver le genre et les nationalités de Percy_Williams 
 +<code scala> 
 +  val percy = yago.where("sujet = '<Percy_Williams_(sprinter)>' ") 
 +  affichePartitions(percy) 
 +</code>
  
 /**  /** 
Ligne 466: Ligne 470:
 val yagoSheela = yago.where("sujet like '%<Sheela>'") val yagoSheela = yago.where("sujet like '%<Sheela>'")
 */ */
- 
-Si oui, quel est son numéro de partition ?  
-Combien de partitions faut-il lire pour trouver la résidence et la nationalité d'Aaron Brown ? 
  
 Remarque concernant le renommage d'attributs dans une requête de jointure. Remarque concernant le renommage d'attributs dans une requête de jointure.
Ligne 644: Ligne 645:
  
  
-=== Equi-jointure lorsque les attribut n'ont pas le même domaine  ===+=== Equi-jointure lorsque les attributs n'ont pas le même domaine  ===
  
 Soit la requête R5 Soit la requête R5
Ligne 696: Ligne 697:
  
 ===== Exercice 4 : Produit Cartésien  ===== ===== Exercice 4 : Produit Cartésien  =====
-Voir diapo 33: Calculer la similarité entre 2 utilisateurs de MovieLens (ou 2 personnes de Yago)+Voir diapo du cours : Calculer la similarité entre 2 utilisateurs de MovieLens ou 2 individus de Yago
  
   * Définir une fonction qui calcule la similarité de Jaccard entre 2 listes d'objets : jaccard(x, y) = cardinal de l'intersection / cardinal de l'union   * Définir une fonction qui calcule la similarité de Jaccard entre 2 listes d'objets : jaccard(x, y) = cardinal de l'intersection / cardinal de l'union
Ligne 716: Ligne 717:
  
  
-===== Exercice 5 : Questions diverses  =====+===== Exercice 5 : Traitement itératif par partition et par groupe d'objets =====
  
-La methode zipWithIndex (numérotant les éléments d'une collection) existe pour un RDD mais pas pour un DataSet+La methode zipWithIndex (numérotant les éléments d'une collection) existe pour un RDD mais pas pour un Dataset
 Ecrire la fonction ''numeroration[T](d: Dataset[T])'' qui retourne un Dataset avec des éléments numérotés. Les numéros doivent être consécutifs. Ecrire la fonction ''numeroration[T](d: Dataset[T])'' qui retourne un Dataset avec des éléments numérotés. Les numéros doivent être consécutifs.
 +Rmq: une solution consiste à utiliser mapPartitionsWithIndex pour connaitre la taille des partitions et parcourir une partition pour affecter les numéros consécutifs à chaque élément.
 +
 +
 +
 +===== Exercice 6 : Chemin le plus long =====
 +Pour les données de yago utilisées précédemment, déterminer les chemins partant des sujets qui vivent (<livesIn>) en 'France'.
 +Un chemin doit être sans circuit (ou sans cycle : ne jamais repasser sur le même sujet).
 +Combien y a -t-il de chemin de longueur 2, 3 ,4 ?
 +Quelle est la longueur maximale ?
 +Montrer que votre solution est efficace. Expliquer ce que vous avez mis en oeuvre pour apporter plus d'efficacité.
  
  
site/enseignement/master/bdle/tmes/tmejointure.1543585760.txt.gz · Dernière modification : de hubert