UsageError: %%sql is a cell magic, but the cell body is empty. Did you mean the line magic %sql (single %)?
UsageError: %%sql is a cell magic, but the cell body is empty. Did you mean the line magic %sql (single %)?
%% Cell type:markdown id: tags:
%% Cell type:markdown id: tags:
Quelles sont les propriétés d'une `geography` ?
Quelles sont les propriétés d'une `geography` ?
%% Cell type:code id: tags:
%% Cell type:code id: tags:
``` python
``` python
%%sql
%%sql
```
```
%% Cell type:markdown id: tags:
%% Cell type:markdown id: tags:
Afficher toutes les régions distinctes
Afficher toutes les régions distinctes
%% Cell type:code id: tags:
%% Cell type:code id: tags:
``` python
``` python
%%sql
%%sql
```
```
%% Cell type:markdown id: tags:
%% Cell type:markdown id: tags:
Combien y a-t-il de régions ?
Combien y a-t-il de régions ?
%% Cell type:code id: tags:
%% Cell type:code id: tags:
``` python
``` python
%%sql
%%sql
```
```
%% Cell type:markdown id: tags:
%% Cell type:markdown id: tags:
## De SQL à JSON
## De SQL à JSON
%% Cell type:markdown id: tags:
%% Cell type:markdown id: tags:
Ecrire, à partir des relations `city` et `country` une requête qui retourne cinq villes et leur pays (sous la forme de simples chaînes de caractères).
Ecrire, à partir des relations `city` et `country` une requête qui retourne cinq villes et leur pays (sous la forme de simples chaînes de caractères).
Le résultat est une table (un multi-ensemble de tuples).
Le résultat est une table (un multi-ensemble de tuples).
%% Cell type:code id: tags:
%% Cell type:code id: tags:
``` python
``` python
%%sql
%%sql
```
```
%% Cell type:markdown id: tags:
%% Cell type:markdown id: tags:
Réécrire la requête afin de retourner des documents JSON.
Réécrire la requête afin de retourner des documents JSON.
Quelques fonctions intéressantes :
Quelques fonctions intéressantes :
*`JSON_OBJECT(key, val[, key, val] ...])` retourne un objet JSON défini par les paires `key: val` fournies en paramètre (la notation avec des crochets et les points de suspension indique que les deux paramètres peuvent être répétés).
*`JSON_OBJECT(key, val[, key, val] ...])` retourne un objet JSON défini par les paires `key: val` fournies en paramètre (la notation avec des crochets et les points de suspension indique que les deux paramètres peuvent être répétés).
*`JSON_ARRAY(val [, val] ...)` retourne un tableau JSON selon le même principe.
*`JSON_ARRAY(val [, val] ...)` retourne un tableau JSON selon le même principe.
%% Cell type:code id: tags:
%% Cell type:code id: tags:
``` python
``` python
%%sql
%%sql
```
```
%% Cell type:markdown id: tags:
%% Cell type:markdown id: tags:
## De JSON à SQL (optionnel)
## De JSON à SQL (optionnel)
%% Cell type:markdown id: tags:
%% Cell type:markdown id: tags:
Ecrire une requête qui retourne une table donnant la superficie de chacune des régions répertoriées dans la relation `countryinfo`, classée par superficie croissante.
Ecrire une requête qui retourne une table donnant la superficie de chacune des régions répertoriées dans la relation `countryinfo`, classée par superficie croissante.
Une fonction intéressante :
Une fonction intéressante :
*`JSON_TABLE(doc, path COLUMNS (name type PATH path[, name type PATH path] ...)) [AS] alias` retourne à partir du composant de `doc` au bout du chemin `path` une table nommée `alias` dont les colonnes sont spécifiées à l'aide des paramètres de `COLUMNS` (le chemin `path` des colonnes complète le chemin initial).
*`JSON_TABLE(doc, path COLUMNS (name type PATH path[, name type PATH path] ...)) [AS] alias` retourne à partir du composant de `doc` au bout du chemin `path` une table nommée `alias` dont les colonnes sont spécifiées à l'aide des paramètres de `COLUMNS` (le chemin `path` des colonnes complète le chemin initial).
Conseil:
Conseil:
* faire un produit de `countryinfo` et `JSON_TABLE(doc...)` pour obtenir le document associé à chaque tuple de `countryinfo` ;
* faire un produit de `countryinfo` et `JSON_TABLE(doc...)` pour obtenir le document associé à chaque tuple de `countryinfo` ;
* commencer par simplement construire une table reprenant les régions et les superficies de chaque tuple/pays.
* commencer par simplement construire une table reprenant les régions et les superficies de chaque tuple/pays.
%% Cell type:code id: tags:
%% Cell type:code id: tags:
``` python
``` python
%%sql
%%sql
```
```
%% Cell type:code id: tags:
%% Cell type:code id: tags:
``` python
``` python
%%sql
%%sql
```
```
%% Cell type:markdown id: tags:
%% Cell type:markdown id: tags:
## MongoDB
## MongoDB
%% Cell type:markdown id: tags:
%% Cell type:markdown id: tags:
En premier, exécutez le tutoriel présent à cette adresse : https://www.mongodb.com/docs/manual/tutorial/getting-started/.
En premier, exécutez le tutoriel présent à cette adresse : https://www.mongodb.com/docs/manual/tutorial/getting-started/.
Ceci vous permettra d'avoir une vue sur les principales commandes de MongoDB :
Ceci vous permettra d'avoir une vue sur les principales commandes de MongoDB :
Vous allez copier le contenu de la table `countryinfo` (champ `doc` bien sûr) dans MongoDB à l'aide de la bibliothèque [pymongo](https://pymongo.readthedocs.io/en/stable/).
Vous allez copier le contenu de la table `countryinfo` (champ `doc` bien sûr) dans MongoDB à l'aide de la bibliothèque [pymongo](https://pymongo.readthedocs.io/en/stable/).
Lisez le tutoriel [Pymongo](https://pymongo.readthedocs.io/en/stable/tutorial.html) pour avoir une idée générale du fonctionnement.
Lisez le tutoriel [Pymongo](https://pymongo.readthedocs.io/en/stable/tutorial.html) pour avoir une idée générale du fonctionnement.
Conseils:
Conseils:
* utilisez les DataFrame de Pandas
* utilisez les DataFrame de Pandas
* utilisez `json.loads` et `to_numpy()` ("Convert the DataFrame to a NumPy array") pour transformer la base en tableau de dictionnaires
* utilisez `json.loads` et `to_numpy()` ("Convert the DataFrame to a NumPy array") pour transformer la base en tableau de dictionnaires
* connectez-vous à la base `mongo` (regardez dans le `docker-compose.yml` comment c'est configuré) créez la base "world_x" et la collection "doc"
* connectez-vous à la base `mongo` (regardez dans le `docker-compose.yml` comment c'est configuré) créez la base "world_x" et la collection "doc"
* utilisez `insert_many` de `pymongo`
* utilisez `insert_many` de `pymongo`
%% Cell type:code id: tags:
%% Cell type:code id: tags:
``` python
``` python
frompymongoimportMongoClient
frompymongoimportMongoClient
importpandasaspd
importpandasaspd
importseabornassns
importseabornassns
importjson
importjson
```
```
%% Cell type:code id: tags:
%% Cell type:code id: tags:
``` python
``` python
result=%sqlSELECTdocFROMcountryinfo;
result=%sqlSELECTdocFROMcountryinfo;
print(result)# type non exploitable en l'état
print(result)# type non exploitable en l'état
```
```
%% Cell type:code id: tags:
%% Cell type:code id: tags:
``` python
``` python
df=pd.DataFrame(result)
df=pd.DataFrame(result)# on passe par les DataFrame Pandas
print(df)
print(df)
print(df["doc"])
print(df["doc"])
```
```
%% Cell type:code id: tags:
%% Cell type:code id: tags:
``` python
``` python
ar_docs=[json.loads(x)forxindf["doc"].to_numpy()]
ar_docs=[json.loads(x)forxindf["doc"].to_numpy()]# on transforme en array NumPy
Vérifiez bien que vous obtenez autant qu'avec MySQL (239 documents).
Vérifiez bien que vous obtenez autant qu'avec MySQL (239 documents).
%% Cell type:code id: tags:
%% Cell type:code id: tags:
``` python
``` python
```
```
%% Cell type:markdown id: tags:
%% Cell type:markdown id: tags:
Affichez la liste (limitée à 5 résultats) indiquant le nom, l'année d'indépendance et les informations démographiques pour les pays dont l'année d'indépendance est supérieure à 1980.
Affichez la liste (limitée à 5 résultats) indiquant le nom, l'année d'indépendance et les informations démographiques pour les pays dont l'année d'indépendance est supérieure à 1980.
Regardez la [fonction `find`](https://www.mongodb.com/docs/manual/tutorial/query-documents/)
Regardez la [fonction `find`](https://www.mongodb.com/docs/manual/tutorial/query-documents/)
%% Cell type:code id: tags:
%% Cell type:code id: tags:
``` python
``` python
```
```
%% Cell type:markdown id: tags:
%% Cell type:markdown id: tags:
Affichez la liste (limitée à 5 résultats) indiquant le nom, l'année d'indépendance et la population pour les pays dont le nombre d'habitant est supérieure à 3 millions.
Affichez la liste (limitée à 5 résultats) indiquant le nom, l'année d'indépendance et la population pour les pays dont le nombre d'habitant est supérieure à 3 millions.
%% Cell type:code id: tags:
%% Cell type:code id: tags:
``` python
``` python
```
```
%% Cell type:markdown id: tags:
%% Cell type:markdown id: tags:
Ecrivez une requête affichant la somme des superficies pour chacune des régions. Pour cela il faut grouper les pays de la même région du monde.
Ecrivez une requête affichant la somme des superficies pour chacune des régions. Pour cela il faut grouper les pays de la même région du monde.
Regardez du côté de la [commande `aggregate`](https://www.mongodb.com/docs/manual/aggregation/).
Regardez du côté de la [commande `aggregate`](https://www.mongodb.com/docs/manual/aggregation/).
%% Cell type:code id: tags:
%% Cell type:code id: tags:
``` python
``` python
```
```
%% Cell type:markdown id: tags:
%% Cell type:markdown id: tags:
Complétez la requête précédente en classant par superficie croissante.
Complétez la requête précédente en classant par superficie croissante.
%% Cell type:code id: tags:
%% Cell type:code id: tags:
``` python
``` python
```
```
%% Cell type:markdown id: tags:
%% Cell type:markdown id: tags:
Affichez les superficies par région avec Seaborn (utilisez `catplot` en mode `bar`).
Affichez les superficies par région avec Seaborn (utilisez `catplot` en mode `bar`).
Pour transformer le tableau de résultats en DataFrame, vous pouvez utiliser `pd.json_normalize`.
Pour transformer le tableau de résultats en DataFrame, vous pouvez utiliser `pd.json_normalize`.