Ci-dessous, les différences entre deux révisions de la page.
Les deux révisions précédentes Révision précédente Prochaine révision | Révision précédente | ||
site:enseignement:master:bdle:tmes:algebrespark [25/10/2017 17:43] hubert [Exercice 1: Requêtes simples sur les données de Yago] |
site:enseignement:master:bdle:tmes:algebrespark [09/10/2018 14:12] (Version actuelle) amine |
||
---|---|---|---|
Ligne 2: | Ligne 2: | ||
- | ====== [TME II-3] Algèbre Spark: Dataset ====== | + | ====== [TME II-2] Algèbre Spark: Dataset ====== |
Ce TME aborde le traitement de requêtes Sparql dans la plateforme Spark. | Ce TME aborde le traitement de requêtes Sparql dans la plateforme Spark. | ||
* Formulation des requêtes dans le langage Scala avec les API de Spark RDD et Dataset. | * Formulation des requêtes dans le langage Scala avec les API de Spark RDD et Dataset. | ||
Ligne 17: | Ligne 17: | ||
</code> | </code> | ||
+ | <showif isloggedin> | ||
+ | **TODO (oct 2017): page MPI pour sparql endpoint sur Yago** | ||
+ | </showif> | ||
Aller dans votre répertoire de travail et lancer le spark-shell avec l'option <fc #ff0000>--driver-memory 10G</fc> | Aller dans votre répertoire de travail et lancer le spark-shell avec l'option <fc #ff0000>--driver-memory 10G</fc> | ||
Ligne 37: | Ligne 40: | ||
Exemple, soient les trois triplets suivants : | Exemple, soient les trois triplets suivants : | ||
(james joue guitare) (marie joue piano) (james ami_de marie) (marie ami_de james) | (james joue guitare) (marie joue piano) (james ami_de marie) (marie ami_de james) | ||
- | le motif ( ?x joue piano) retourne la liaison ?x->james | + | le motif ( ?x joue piano) retourne la liaison ?x->marie |
le motif ( ?x joue ?y) retourne les liaisons ?x->james, ?y-> guitare d’une part et | le motif ( ?x joue ?y) retourne les liaisons ?x->james, ?y-> guitare d’une part et | ||
?x->maire, ?y->piano d’autre part. | ?x->maire, ?y->piano d’autre part. | ||
Ligne 50: | Ligne 53: | ||
===== Exercice 1: Requêtes simples sur les données de Yago ===== | ===== Exercice 1: Requêtes simples sur les données de Yago ===== | ||
+ | |||
+ | Lire un exemple de données | ||
+ | <code> | ||
+ | more /Infos/bd/spark/dataset/yago/yagoMiniSample.txt | ||
+ | </code> | ||
+ | Lire la liste des propriétés | ||
+ | <code> | ||
+ | more /Infos/bd/spark/dataset/yago/yagoFacts5M_properties.txt | ||
+ | </code> | ||
===Charger le dataset YAGO=== | ===Charger le dataset YAGO=== | ||
Ligne 94: | Ligne 106: | ||
<showif isloggedin> | <showif isloggedin> | ||
**<fc #008000>REPONSE</fc>** | **<fc #008000>REPONSE</fc>** | ||
- | <code scala> | + | <code scala> |
- | val t1 = yago.where("sujet = '<Barack_Obama>'"). | + | val t1 = yago.where("sujet = '<Barack_Obama>'"). |
- | withColumnRenamed("prop","p"). | + | withColumnRenamed("prop","p"). |
- | withColumnRenamed("objet","o"). | + | withColumnRenamed("objet","o"). |
- | select("p", "o") | + | select("p", "o") |
- | t1.show(20) | + | t1.show(20) |
- | </code scala> | + | </code> |
- | + | ||
</showif> | </showif> | ||
Ligne 132: | Ligne 142: | ||
===R3: Les leaders parisiens === | ===R3: Les leaders parisiens === | ||
+ | |||
+ | La requête est une **étoile** formée de deux triplets | ||
<code sparql> | <code sparql> | ||
?x <livesIn> <Paris> . | ?x <livesIn> <Paris> . | ||
?x <isLeaderOf> ?z | ?x <isLeaderOf> ?z | ||
</code> | </code> | ||
+ | |||
+ | |||
+ | <showif isloggedin> | ||
+ | **<fc #008000>REPONSE</fc>** | ||
+ | <code scala> | ||
+ | val t1 = yago.where("prop = '<livesIn>' and objet = '<Paris>'"). | ||
+ | withColumnRenamed("sujet","x"). | ||
+ | select("x") | ||
+ | |||
+ | val t2 = yago.where("prop = '<isLeaderOf>' "). | ||
+ | withColumnRenamed("sujet","x"). | ||
+ | withColumnRenamed("objet","z"). | ||
+ | select("x","z") | ||
+ | |||
+ | val t1t2 = t1.join(t2, "x") | ||
+ | t1t2.show(5) | ||
+ | </code> | ||
+ | </showif> | ||
+ | |||
Le résultat doit être: | Le résultat doit être: | ||
Ligne 145: | Ligne 176: | ||
+--------------------+--------------------+ | +--------------------+--------------------+ | ||
</code> | </code> | ||
+ | |||
+ | |||
+ | ===R4: Les joueurs du royaume uni. === | ||
+ | |||
+ | La requête est un **chemin** formé de deux triplets | ||
+ | <code sparql> | ||
+ | ?x <playsFor> ?y . | ||
+ | ?y <isLocatedIn> <United_Kingdom> | ||
+ | </code> | ||
+ | |||
+ | <showif isloggedin> | ||
+ | **<fc #008000>REPONSE</fc>** | ||
+ | <code scala> | ||
+ | val t1 = yago.where("prop = '<playsFor>'"). | ||
+ | withColumnRenamed("sujet","x"). | ||
+ | withColumnRenamed("objet","y"). | ||
+ | select("x","y") | ||
+ | |||
+ | val t2 = yago.where("prop = '<isLocatedIn>' and objet = '<United_Kingdom>'"). | ||
+ | withColumnRenamed("sujet","y"). | ||
+ | select("y") | ||
+ | |||
+ | val t1t2 = t1.join(t2, "y") | ||
+ | t1t2.show(5) | ||
+ | </code> | ||
+ | </showif> | ||
+ | |||
+ | Les 5 premiers éléments du résultat sont : | ||
+ | <code> | ||
+ | | y | x | | ||
+ | +--------------------+--------------------+ | ||
+ | | <Royal_Air_Force>| <George_Ayres>| | ||
+ | | <Royal_Air_Force>|<Jack_Jones_(foot...| | ||
+ | | <Royal_Air_Force>|<John_Hinton_(foo...| | ||
+ | |<University_of_Ed...|<James_Craigen_(f...| | ||
+ | |<University_of_Ed...| <Ronald_Brebner>| | ||
+ | +--------------------+--------------------+ | ||
+ | </code> | ||
+ | |||
+ | |||
+ | |||
+ | |||
+ | ===R5: Les acteurs qui influencent des créateurs === | ||
+ | |||
+ | La requête est un **flocon** (ou snowflake) formé de 5 triplets : | ||
+ | <code sparql> | ||
+ | ?x <isCitizenOf> ?y . | ||
+ | ?x <actedIn> ?z . | ||
+ | ?x <influences> ?t . | ||
+ | ?t <livesIn> ?u . | ||
+ | ?t <created> ?v | ||
+ | </code> | ||
+ | |||
+ | <showif isloggedin> | ||
+ | **<fc #008000>REPONSE</fc>** | ||
+ | <code scala> | ||
+ | val t1 = yago.where("prop = '<isCitizenOf>'"). | ||
+ | withColumnRenamed("sujet","x"). | ||
+ | withColumnRenamed("objet","y"). | ||
+ | select("x","y") | ||
+ | |||
+ | val t2 = yago.where("prop = '<actedIn>'"). | ||
+ | withColumnRenamed("sujet","x"). | ||
+ | withColumnRenamed("objet","z"). | ||
+ | select("x","z") | ||
+ | |||
+ | val t3 = yago.where("prop = '<influences>'"). | ||
+ | withColumnRenamed("sujet","x"). | ||
+ | withColumnRenamed("objet","t"). | ||
+ | select("x", "t") | ||
+ | |||
+ | val t4 = yago.where("prop = '<livesIn>'"). | ||
+ | withColumnRenamed("sujet","t"). | ||
+ | withColumnRenamed("objet","u"). | ||
+ | select("t","u") | ||
+ | |||
+ | val t5 = yago.where("prop = '<created>'"). | ||
+ | withColumnRenamed("sujet","t"). | ||
+ | withColumnRenamed("objet","v"). | ||
+ | select("t", "v") | ||
+ | |||
+ | val r = t1.join(t2, "x").join(t3,"x").join(t4,"t").join(t5,"t") | ||
+ | r.show(10) | ||
+ | </code> | ||
+ | </showif> | ||
+ | |||
+ | Le résultat, limité à 10 lignes, doit être: | ||
+ | <code> | ||
+ | +--------------+----------+---------+-----------------+--------------------+----------------+ | ||
+ | | t| x| y| z| u| v| | ||
+ | +--------------+----------+---------+-----------------+--------------------+----------------+ | ||
+ | |<Irvine_Welsh>|<Iggy_Pop>|<Germany>| <Cry-Baby>| <Dublin>|<Dockers_(film)>| | ||
+ | |<Irvine_Welsh>|<Iggy_Pop>|<Germany>| <Cry-Baby>|<Republic_of_Irel...|<Dockers_(film)>| | ||
+ | |<Irvine_Welsh>|<Iggy_Pop>|<Germany>| <Suck_(film)>| <Dublin>|<Dockers_(film)>| | ||
+ | |<Irvine_Welsh>|<Iggy_Pop>|<Germany>| <Suck_(film)>|<Republic_of_Irel...|<Dockers_(film)>| | ||
+ | |<Irvine_Welsh>|<Iggy_Pop>|<Germany>|<Hardware_(film)>| <Dublin>|<Dockers_(film)>| | ||
+ | |<Irvine_Welsh>|<Iggy_Pop>|<Germany>|<Hardware_(film)>|<Republic_of_Irel...|<Dockers_(film)>| | ||
+ | |<Irvine_Welsh>|<Iggy_Pop>|<Germany>| <Dead_Man>| <Dublin>|<Dockers_(film)>| | ||
+ | |<Irvine_Welsh>|<Iggy_Pop>|<Germany>| <Dead_Man>|<Republic_of_Irel...|<Dockers_(film)>| | ||
+ | |<Irvine_Welsh>|<Iggy_Pop>|<Germany>| <Gimme_Danger>| <Dublin>|<Dockers_(film)>| | ||
+ | |<Irvine_Welsh>|<Iggy_Pop>|<Germany>| <Gimme_Danger>|<Republic_of_Irel...|<Dockers_(film)>| | ||
+ | +--------------+----------+---------+-----------------+--------------------+----------------+ | ||
+ | |||
+ | </code> | ||
+ | |||
+ | |||
+ | |||
+ | ===R6: Les paires de personnes mariées et nées dans le même pays === | ||
+ | |||
+ | ===R7: Les personnes influencées par un prix nobel=== | ||
+ | |||
+ | ===R8: L'acteur ayant joué dans le plus grand nombre de films === | ||
+ | |||
+ | |||
+ | |||
+ | |||
- | ===== Exercice 2 : Requêtes sur Freebase===== | + | ===== Exercice subsidiaire : Requêtes sur Freebase===== |
L’objectif de cet exercice est d’exprimer en Scala les différents types de motifs complexes. | L’objectif de cet exercice est d’exprimer en Scala les différents types de motifs complexes. | ||
Ligne 211: | Ligne 358: | ||
</code> | </code> | ||
- | ===== Exercice 3===== | + | ===== Exercice subsidiaire===== |
a) A partir de Q4 proposer une requête formant un chemin de longueur 4 puis 5 (avec des propriétés différentes de celles de Q4). | a) A partir de Q4 proposer une requête formant un chemin de longueur 4 puis 5 (avec des propriétés différentes de celles de Q4). |