Soit table R
:
A | B | C | D |
---|---|---|---|
x | y | 1 | 2 |
y | y | 1 | 5 |
x | z | 2 | 3 |
y | y | 1 | 4 |
z | y | 4 | 1 |
y | y | 2 | 2 |
Ecrivez la requete qui renvoie le resultat suivant
A | B | N |
---|---|---|
x | y | 1 |
x | z | 1 |
x | 2 | |
y | y | 3 |
y | 3 | |
z | y | 1 |
z | 1 | |
y | 5 | |
z | 1 | |
6 |
select a, b, count(D) as n
from R
group by cube(a, b)
GROUP BY CUBE(A,B), CUBE(B,C)
retourne combien de group?
16 = (2^2) * (2^2)
((AB), A), (B), ()) x ((BC), (C), ())
(ABC), (AB), (ABC), (AB), (ABC), (AB), (AC), (A)
(BC), (B), (BC), (B), (BC), (B), (C), ()
SELECT A, B, C, sum(D) as n FROM R
GROUP BY ROLLUP (A, B, C);
retourne 13 n-uplets:
A | B | C | N |
---|---|---|---|
x | y | 1 | 2 |
x | y | 2 | |
x | z | 2 | 3 |
x | z | 3 | |
x | 5 | ||
y | y | 1 | 9 |
y | y | 2 | 2 |
y | y | 11 | |
y | 11 | ||
z | y | 4 | 1 |
z | y | 1 | |
z | 1 | ||
17 |
Liste des 5 produits les plus vendus en France. On affiche le nom du produit, la quantité vendue et top 5 produits plus vendus
with T as (
Select p.nom, sum(v.quantité), rank over (order by sum(v.quantite) desc as rang )
From Ventes v, Prod p, Magasin m, Zone z
Where v.prod = p.prod and v.magasin = m.magasin
And m.zone = z.zone and z.pays =’France’
Group by p.nom)
Select * from T where rang <=5;
Pour chacun des 10 premiers jours du mois de mai 2015, donnez la quantité moyenne de produits de catégorie alimentaire vendus les 7 jours précédents.
Select
num_date,
avg(v.quantite) over
(order by v.num_date
range between interval ‘7’ Day
preceding and current row) as qte-moyenne
From Vente v, Prod p, Classe c
Where
v .prod = p. prod and p.Classe = c.classe
and c.categorie = ‘alimentaire’
and v.num_date > ‘01-05-2015’
and v.num_date < ’10-05-2015’
Order by v.num_date desc;
Pour chaque client, donner le montant de ses achats par trimestre en 1993.
Select v.client, d.trimestre, sum(v.prix * v.quantite) over (partition by c.client,
order by sum(v.prix*v.quantite) as montant_par_trimestre
From Ventes v, Date d
Where v.num_date =d.num_date and d.annee = 1993
Group by v.client, d.trimestre
Order by v.client, montant_par_trimestre;
On veut calculer le montant total des ventes selon les 3 dimensions suivantes : date, produit, magasin. On veut afficher la famille du produit et la superficie du magasin, et on veut pouvoir naviguer au travers des différents niveaux de date (année, trimestre, mois, jour).
Select c.famille, m.superficie, d.annee, d.trimestre, d.num_mois, d.num_jour, sum
(v.prix * v.quantite) as montant-total
From Vente v, prod p, classe c, date d, magasin m
Where v.prod=p.prod
And p.classe = c.classe
And v.num_date = d.num_date
And v.magasin = m.magasin
Group by c.famille, m.superficie, rollup(d.annee, d.trimestre, d.num_mois,
d.num_jour)
scala> R // liste des tuples (A, B, C)
scala> S // liste des tuples (C, D, E)
// calculer R join S on R.C=S.C
scala> R.map{case(a,b,c)=>(c, (a,b))}.join(S.map{case(c,d,e)=>(c,(d,e))})
//porduit une RDD de la forme (c, ((a,b), (d,e)))
x(0) // acces a l'element 0 de l'array x
x._1 // acces a l'element 1 du tuple x
scala> val triples = sc.textFile("...").map(x=>x.split(",")).map(x=>(x(0),x(1),x(2)))
scala> val p0 = triples.filter{case (s,p,o) => p.contains("p0")}
scala> val p1 = triples.filter{case (s,p,o) => p.contains("p1")}
scala> val p2 = triples.filter{case (s,p,o) => p.contains("p2")}
scala> val p3 = triples.filter{case (s,p,o) => p.contains("p3")}
> (q1) select ?x ?z where { ?x p0 ?y . ?y p1 ?w. ?w p2 ?z}
>>> x -> y
>>> y -> w
>>> w -> z
val q1 = p0.
map{ case(x, p0, y)=>(y,x) }.
join(p1.map{ case(y, p1, w) => (y,w) }). // J'ai (y, (x, w))
map{ case(y,(x,w)) => (w, (x, y)) }. // J'ai (w, (x, y))
join(p2.map{ case(w, p, z) => (w, z) }). // J'ai (w, (x, y), z)
map{ case(w, (x, y), z) => (x, z) }
> (q2) select ?x ?z where { ?x p2 ?z. ?y p1 ?x. ?x p3 ?w}
>>> x -> z
>>> y -> x
>>> x -> w
val q2 = p2.
map{ case(x, p1, z) => (x, z) }.
join(p1.map{ case(y, p1, x) => (x, y) } ). // J'ai (x, (z, y)).
join(p3.map{ case(x, p3, w) =>(x, w) }). // J'ai (x, (z, y), w)
map( case (x, (z,y), w) => (x, z))
select ?p ?s
where {?p studiedAt ?u. ?p supervisedBy ?s. ?s studiedAt ?u}
val q2 = studiedAt.
map{case(p,sat,u)=>(p,u)}.
join(supervisedBy.map{case(p,sby,s)=>(p,s)}).
map{case(p,(u,s))=>(s,(p,u))}.
join(studiedAt.map{case(ps,sat,us)=>(ps,us)}).
map{case(s,((p,u),us))=>(p,u,s,us)}.
filter{case(p,u,s,us)=>u==us}.map{case(p,u,s,us)=>(p,s)}
select ?p ?s
where ?p studiedAt ?u. ?p supervisedBy ?s. ?s studiedAt ?u
val q2 = studiedAt.
map{case(p,sat,u)=>(p,u)}.
join(supervisedBy.map{case(p,sby,s)=>(p,s)}).
map{case(p,(u,s))=>(s,(p,u))}.
join(studiedAt.map{case(ps,sat,us)=>(ps,us)}).
map{case(s,((p,u),us))=>(p,u,s,us)}.
filter{case(p,u,s,us)=>u==us}.map{case(p,u,s,us)=>(p,s)}
Afficher la liste des clients avec le montant total de leurs commandes. Pour chaque client, donner son n° et le montant total de ses commandes. Trier le résultat par ordre décroissant du montant. Afficher seulement les 10 premiers clients.
with R1 as(
select c_custkey, sum(o_totalprice) as TOTAL,
rank() over(order by sum(o_totalprice)) as RANG
from Customer, Orders
where c_custkey = o_custkey
group by c_custkey) select * from R1 where rang <= 10;
Afficher la liste des pays, référencés dans Nation, avec leur nombre de clients. Donner le n° du pays, son nom et le nb de clients. Classer le résultat par ordre décroissant du nombre de clients.
with R2 as(
select n_nationkey, n_name, count(*) as NB_DE_CLIENTS,
rank() over(order by count(*) desc) as rang
from Nation, Customer
where n_nationkey = c_nationkey
group by n_nationkey, n_name
) select * from R2 where rang <= 5;
Afficher seulement les pays classés parmi les 20% meilleurs.
with R3 as(
select n_nationkey, n_name, count(*) as NB_DE_CLIENTS,
percent_rank() over(order by count(*) desc)
as rang_pourcent
from Nation, Customer
where n_nationkey = c_nationkey
group by n_nationkey, n_name
) select * from R3 where rang_pourcent <= 0.2;
Pour chaque pays, donner le classement national des produits les plus achetés par des clients de ce pays. Afficher les attributs nom du pays, numéro du produit, quantité_achetée et rang.
with R5 as(
select n_name as NATION, ps_partkey as PRODUCT,
count(*) as QUANTITE,
rank() over(partition by n_name order by count(*) desc)
as RANG_PAYS
from Partsupp, Nation, Customer, Lineitem, Orders
where n_nationkey = c_nationkey and c_custkey = o_custkey
and l_orderkey = o_orderkey and ps_partkey = l_partkey
group by n_name, ps_partkey
) select * from R5 where QUANTITE > 180;
Tenir compte seulement des commandes effectuées après le 01/04/1998. Pour chaque jour donner le prix moyen des commandes effectuées les 90 jours précédents. La moyenne est calculée sur l’ensemble des commandes enregistrées pendant les 90 jours précédents.
with R6 as(
select o_orderdate, avg(sum(o_totalprice))
over (order by o_orderdate
range between interval '90' day preceding
and current row) as MOYENNE_TRIMESTRE
from Orders
where o_orderdate >= '01/06/1998'
group by o_orderdate
) select * from R6 where rownum <= 20;
Pour chaque jour, quel est le chiffre d’affaire des 30 derniers jours
with R7 as (
select o_orderdate, sum(sum(o_totalprice))
over (order by o_orderdate
range between interval '30' day preceding
and current row) as CA_TRIMESTRE
from Orders
where o_orderdate >= '01/06/1998'
group by o_orderdate
) select * from R7 where rownum <= 10;
Question 1 : Opérations algébriques
step 1 :remonter dans la division produit => Roll up de nom_produit à type de produit
step 2 :
slice sur la dimension produit(type = cuivre)
step 3 :
slice sur la dimension jour()jour<6-01-98
step 4 :
enlever une dimension => projection aggregative sur(produit,client)
On peut faire aussi 3,1,2,4
roll up(a,b,c): a,b et c sont 3 niveau de la mm dimension (a est le niveau le plus hau et c est le niveau le plus bas) Cube(a,b,c): a,b,c 3 dimension différent
with C2 as(
select p_partkey,c_custkey,o_orderdate,
sum(o_totalprice)
from part,customer,orders,lineitem
where c_custkey = o_orderkey
and l_orderkey = o_orderkey
and l_partkey = p_partkey
group by p_partkey,c_custkey,o_orderdate
order by p_partkey,c_custkey)
select *
from C2
where rownum<=10;
Résultat :
P_PARTKEY | C_CUSTKEY | O_ORDERDAT | SUM(O_TOTALPRICE) |
---|---|---|---|
1 | 1281 | 11/12/1994 | 247632,44 |
3 | 129 | 19/11/1992 | 261013,14 |
4 | 548 | 21/09/1994 | 165456,46 |
4 | 678 | 27/02/1993 | 185606,97 |
4 | 930 | 17/12/1994 | 277890,79 |
5 | 261 | 29/06/1993 | 319306,86 |
5 | 513 | 01/05/1995 | 105559,7 |
9 | 102 | 09/05/1997 | 164529,1 |
10 | 999 | 05/09/1993 | 222435,59 |
11 | 453 | 26/05/1997 | 329149,3 |
Question 2 : Agrégation sur les niveaux d’une dimension On veut calculer, en une seule requête T2, tous les cubes obtenus à partir de C2 par agrégation sur la dimension client (ayant 3 niveaux). Le résultat de la requête contient toutes les données des cubes à tous les niveaux d’agrégation sur la dimension client.
with T2 as(
select p_type, c_name, n_name, r_name, sum(o_totalprice) as TOTAL
from Part, PartSupp, Lineitem, Orders, Customer, Region, Nation
where p_partkey = ps_partkey and ps_partkey = l_partkey
and l_orderkey = o_orderkey and c_custkey = o_custkey
and n_nationkey = c_nationkey and r_regionkey = n_regionkey
and p_type LIKE '%COPPER' and o_orderdate >= '01/06/1998'
group by rollup(p_type, c_name, n_name, r_name)
)select *
from T2
where rownum <= 30;
Question 3 a : Projection agrégative sur une ou plusieurs dimensions
select r_name, sum(o_totalprice) as TOTAL
from Part, Customer, Lineitem, Orders, Region, Nation
where p_partkey = l_partkey and c_custkey = o_custkey and o_orderkey = l_orderkey
and n_nationkey = c_nationkey and r_regionkey = n_regionkey
and p_type LIKE '%COPPER' and o_orderdate >= '01/06/1998'
and r_name = 'AFRICA'
group by r_name;
Question 3 b : Opérations algébriques
with R2 as
(select p_type, r_name, extract(year from o_orderdate)as ANNEE, sum(o_totalprice) as TOTAL
from Part, Customer, Lineitem, Orders, Region, Nation
where p_partkey = l_partkey and c_custkey = o_custkey and o_orderkey = l_orderkey
and n_nationkey = c_nationkey and r_regionkey = n_regionkey
and p_type LIKE '%COPPER' and o_orderdate >= '01/06/1998'
group by cube (p_type, r_name, extract(year from o_orderdate))
) select r_name, TOTAL from R2 where r_name = 'AFRICA' and annee is null and p_type is null;
Question 4 : Agrégation sur trois dimensions
'’Date_commande (orderdate, numMois, numAnnée). L’attribut orderdate correspond au jour de la commande.’ a) Définir en SQL la vue Date_commande
with Date_commande as
(select o_orderdate, extract(month from o_orderdate) as numMois, extract(year from o_orderdate)
from Orders)
Question 1
def maxEntiers(in: List[Int])= in.reduce((a,b)=>(if(a>b)a else b)) def scEntiers(in: List[Int])= in.map(e=>e*e).reduce((a,b)=>(a+b)) def moyEntiers(in: List[Int])={val p = in.map(e=>(1,e)).reduce((a,b)=>(a._1+b._1, a._2+b._2)); p._2/p._1}
Question 2
+ Calculer pour l'année 2009 le maximum de ses températures.
```Java
val listeTemp = List("7,2010,04,27,75", "12,2009,01,31,78", "41,2009,03,25,95", "2,2008,04,28,76", "7,2010,02,32,91")
val temp2009 = listeTemp.map(x=>x.split(",")).filter(_(1).toInt==2009).map(x=>x(3).toInt)
maxEntiers(temp2009)
moyEntiers(temp2009)
Question 3
val melange = List("1233,100,3,20171010", "1224,22,4,20171009", "100,lala,comedie", "22,loup,documentaire")
val notes = melange.map(_.split(",")).filter(_(0).toInt>=1000).map(x=>(x(0).toInt,x(1), x(2).toInt, x(3).toInt))
val films = melange.map(_.split(",")).filter(_(0).toInt<=100).map(x=>(x(0).toInt,x(1), x(2)))
Question 4
val personnes = List(("Joe", "etu", 3), ("Lee", "etu", 4), ("Sara", "ens", 10), ("John", "ens", 5), ("Bill", "eng",20))
class Etu(nom:String, annee:Int){override def toString()="Etudiant en " +annee+" annee"}
class Ens(nom:String, annee:Int){override def toString()="Enseignant avec " +annee+" annee d'experience"}
val classes_personnes = personnes.map(x=> x match { case(a,"ens",b) =>new Ens(a,b); case(a, "etu", b) =>new Etu(a,b); case _=>None}).filter(_!=None)
Fichier wordcount: lignes de la forme En.d updates 3 24145.
val data = sc.textFile("wordcount.txt")
val q1 = data.map(x => x.split(" ")).map(x => x(3).toDouble)
val q2 = q1.filter(x => x >= 1000 && x <= 1300).
map(x => x.toInt)
val q33 = q2.filter(x => x % 3 == 0)
val q34 = q2.filter(x => x % 4 == 0)
val q4 = q33.map(x => x / 10)
val q51 = q4.distinct
val q52 = q33.intersection(q34)
val q6 = q33.subtract(q34)
val q7 = q33.union(q2.filter(x => x % 10 == 0))
def min(a : Double, b : Double):Double = if (a < b) a else b
def max(a : Double, b : Double):Double = if (a > b) a else b
val q9sum = q8.sum
val q9min = q8.reduce(min)
val q9max = q8.reduce(max)
Manipulation de RDDs sous forme de paires clé-valeur
val list = data.map(_.split(" "))
val q12 = list.map(x=>x(2))
val q13 = list.map(x=>(x(0),x(2).toInt))
val q14 = q13.reduceByKey((x,y)=>x+y)
//ou bien q13.reduceByKey(_+_)
val q13bis = list.map(x=>(x(0),x(2).toInt)).map(x=>(x._1.split("\\.")(0), x._2))
val q2a = notes.map{case(userId,movieId,rating,ts)=>(userId,1)}.reduceByKey(_+_)
val q2b = utilis.map{case(userId,gender,age,occup,zipcode)=>(userId,zipcode)}
.join(notes.map{case(userId,movieId,rating,ts)=>(userId,1)})
.map{case (userId,(zipcode, nb))=>(zipcode, 1)}
.reduceByKey(_+_)
val q2c = notes.map(x=>(x(1),1)).join(films.map(x=>(x(0),x(2))))
.map{case (movieID, (genre,nb))=>(genre, 1)}
.reduceByKey(_+_)
val q2d = notes.map(x=>(x(0),1)).reduceByKey(_+_).takeOrdered(10)
val films_bis = films.map(x=>(x._1,x._2,x._3.split("\\|"))).flatMap{case(a,b,l)=>l.map(x=>(a,b,x))}
R1: Les régions dont la capitale (régionale) est Nantes
?x <hasCapital> <Nantes>
La requête s’écrit ainsi avec une opération de sélection where, un renommage withColumnRenamed et une projection select :
val r1 = yago.where("prop = '<hasCapital>' and objet = '<Nantes>'")
.withColumnRenamed("sujet","x")
.
select("x")
r1.show(5)
Le résultat de la requête est :
x | |
---|---|
<Duchy_of_Brittany> |
|
<Pays_de_la_Loire > |
R2: La fiche de Barack Obama
Afficher toutes les paires (propriété,objet) au sujet de <\Barack_Obama>
REPONSE
val t1 = yago.where("sujet = '<Barack_Obama>'").
withColumnRenamed("prop","p").
withColumnRenamed("objet","o").
select("p", "o")
t1.show(20)
Le résultat doit être :
P | O | ||||||
---|---|---|---|---|---|---|---|
<graduatedFrom> |
<Columbia_University> |
||||||
<graduatedFrom> |
<Harvard_Law_School> |
||||||
<hasGender> |
<male> |
||||||
<hasWonPrize> |
<Grammy_Award> |
||||||
<hasWonPrize> |
<Nobel_Peace_Prize> |
||||||
<isAffiliatedTo> |
<Democratic_Party> |
||||||
<isCitizenOf> |
<Germany> |
||||||
<isCitizenOf> |
<Wales> |
||||||
<isCitizenOf> |
<United_States> |
||||||
<isCitizenOf> |
<Scotland> |
||||||
<isCitizenOf> |
<Kenya> |
||||||
<isCitizenOf> |
<Israel> |
||||||
<isPoliticianOf> |
<United_States> |
||||||
<livesIn> |
<Illinois> |
<livesIn> |
<Chicago> |
<wasBornIn> |
<Honolulu> |
R3: Les leaders parisiens
La requête est une étoile formée de deux triplets
?x <livesIn> <Paris>
?x <isLeaderOf> ?z
REPONSE
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)
Le résultat doit être:
| X | Z |
| :————- | :————- |
|<Louis_Blanc>
|<Republican_Union...>
|
|<Stefano_Zacchiroli>
| <Software_Heritage>
|
R4: Les joueurs du royaume uni.
La requête est un chemin formé de deux triplets
?x <playsFor> ?y .
?y <isLocatedIn> <United_Kingdom>
REPONSE
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)
Les 5 premiers éléments du résultat sont :
| 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>
|
R5: Les acteurs qui influencent des créateurs
La requête est un flocon (ou snowflake) formé de 5 triplets :
?x <isCitizenOf> ?y .
?x <actedIn> ?z .
?x <influences> ?t .
?t <livesIn> ?u .
?t <created> ?v
REPONSE
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)
Le résultat, limité à 10 lignes, doit être :
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)> |