Données (uniquement pour information) : objets trouvés à la SNCF
Quelques exemples de données :
Date | Type d'objets | Nature d'objets | Gare | Code UIC | Date et heure de restitution |
---|---|---|---|---|---|
16 sept 2020 14:57 | Bagagerie: sacs, valises, cartables | Valise, sac sur roulettes | Cherbourg | 0087444877 | |
16 sept 2020 14:51 | Vêtements, chaussures | Autres vêtements | Cherbourg | 0087444877 | |
16 sept 2020 14:50 | Vêtements, chaussures | Chaussures (autre que chaussures de ski et patins) | Paris Montparnasse | 0087391003 | |
16 sept 2020 14:47 | Optique | Lunettes | Paris Montparnasse | 0087391003 |
Considérez que l'on vous donne en temps réel les nouveaux objets trouvés.
- Trouvez une clef de partitionnement valide (en expliquant)
- À partir des quelques exemples utilisez votre clef de partitionnement pour les regrouper
- Pour la suite nous allons interroger la base tel que vous l'avez organisé. Pour chaque question indiquez si la requête s'effectue "directement" sur une partition ou si plusieurs partitions doivent être interrogées. Dans ce dernier cas indiquez distinctement ce qu'il y a à faire dans la partie map et dans la partie reduce :
- Quels sont les objets trouvés aujourd'hui ?
- Quel jour de la semaine trouvons-nous le plus d'objets ?
- Quel jour de la semaine trouvons-nous le plus d'objets du type vêtement ?
- Quels sont les objets trouvés à Paris Gare de Lyon ?
- Combien d'objets trouvés le 2 janvier 2020 ont été restitués ?
- Nous décidons de prendre les gares comme clef de partitionnement en utilisant un hash. C'est une donnée stable et le hash sur le nom de la gare va permettre de répartir les gares entre les plus chargées et les moins chargées sur notre cluster.
- Pour les exemples présentés : les 2 premières lignes seront dans une partition et les 2 suivantes seront dans une autre.
- Requêtes :
- Cette requête va nous demander de parcourir toutes les partitions, on va avoir besoin de map/reduce: - map: doit retourner toutes les lignes représentant un objet trouvé aujourd'hui - reduce: doit juste concaténer tous les résultats fourni par map
- Cette requête va nous demander de parcourir toutes les partitions, on va avoir besoin de map/reduce:
- map: doit retourner un dictionnaire contentant en clef chaque jour de la semaine et en valeur le nombre d'objet trouvés ce jour là (
{'lundi':12,'mardi':8,…}
) - reduce: va faire la somme jour à jour des résultats des map puis chercher le jour avec le plus grand nombre - Cette requête va nous demander de parcourir toutes les partitions, on va avoir besoin de map/reduce: - map: doit retourner un dictionnaire contentant en clef chaque jour de la semaine et en valeur le nombre d'objet trouvés du type vêtement ce jour là - reduce: va faire la somme jour à jour des résultats des map puis chercher le jour avec le plus grand nombre
- Avec notre clef de partitionnement cette information peut être directement trouvée (type 2)
- Cette requête va nécessiter un map/reduce:
- map: compter les objets trouvés le 2 janvier 2020 qui ont une date de restitution
- reduce: faire la somme des résultats des map
Données (uniquement pour information) : Disponibilité des places Vélomagg en temps réel
Quelques exemple de données :
nom | identifiant | latitude | longitude | places occupées | places libres | places total |
---|---|---|---|---|---|---|
Rue Jules Ferry - Gare Saint-Roch | 001 | 43.605366 | 3.881346 | 10 | 2 | 12 |
Comédie | 002 | 43.608148 | 3.878778 | 9 | 15 | 24 |
Esplanade | 003 | 43.609478 | 3.881293 | 18 | 14 | 32 |
Hôtel de Ville | 004 | 43.599088 | 3.894866 | 6 | 10 | 16 |
Corum | 005 | 43.613989 | 3.881600 | 11 | 1 | 12 |
Place Albert 1er - St Charles | 006 | 43.616768 | 3.873375 | 16 | 15 | 31 |
Foch | 007 | 43.610989 | 3.873345 | 7 | 1 | 8 |
Considérez que toutes les minutes, vous recevez la liste complète à jour.
- Trouvez une clef de partitionnement valide (en expliquant)
- À partir des quelques exemples utilisez votre clef de partitionnement pour les regrouper
- Pour la suite nous allons interroger la base tel que vous l'avez organisé. Pour chaque question indiquez si la requête s'effectue "directement" sur une partition ou si plusieurs partitions doivent être interrogées. Dans ce dernier cas indiquez distinctement ce qu'il y a à faire dans la partie map et dans la partie reduce :
- Combien de places sont disponibles à l'Hotel de Ville ?
- Je suis à la latitude x et longitude y où puis-je trouver une place ?
- Quel est le graphique d'occupation de la station Place Albert 1er - St Charles ?
- Je décide d'utiliser le nom comme clef de partitionnement avec un hash. C'est une information stable et toute mes partitions auront la même taille (toutes les stations ont 24h*60 minutes lignes par jours).
- Toutes les lignes présentées seront dans des partitions différentes
- Requêtes :
- C'est une requête direct avec le nom de la station et la date je peux aller directement chercher la ligne qui m'intéresse
- Je dois chercher pour toutes les stations donc je passe par un map/reduce
- map: calcule la distance entre ma position et la position de la station et renvoie un tuple de 3 valeurs : l'identifiant de la station, la distance avec moi et le nombre de places disponibles
- reduce: prend la station avec la distance minimum qui a un nombre de place supérieur à 0
- C'est une requête de type 2. Je peux aller dans une partition et chercher toutes les données pour tracer une courbe où pour chaque minute (en abscisse) j'aurais calculé en ordonnée le pourcentage de places occupées (
{places occupées}*100/{places total}
)
Note:
Pour bien comprendre les partitions auront une forme comme celle-ci:
date | nom | identifiant | latitude | longitude | places occupées | places libres | places total |
---|---|---|---|---|---|---|---|
16 sept 2020 14:57 | Rue Jules Ferry - Gare Saint-Roch | 001 | 43.605366 | 3.881346 | 10 | 2 | 12 |
16 sept 2020 14:56 | Rue Jules Ferry - Gare Saint-Roch | 001 | 43.605366 | 3.881346 | 10 | 2 | 12 |
16 sept 2020 14:55 | Rue Jules Ferry - Gare Saint-Roch | 001 | 43.605366 | 3.881346 | 9 | 3 | 12 |
16 sept 2020 14:54 | Rue Jules Ferry - Gare Saint-Roch | 001 | 43.605366 | 3.881346 | 7 | 5 | 12 |
16 sept 2020 14:53 | Rue Jules Ferry - Gare Saint-Roch | 001 | 43.605366 | 3.881346 | 7 | 5 | 12 |
16 sept 2020 14:52 | Rue Jules Ferry - Gare Saint-Roch | 001 | 43.605366 | 3.881346 | 1 | 9 | 12 |
- J'ai uniquement ajouté la date pour conserver un historique des données.
- Au sujet de l'évidente duplication des informations il y a différentes manière de gérer ça, ça dépend beaucoup de la base de données utilisé. Les bases de données orientées colonnes n'ont particulièrement pas de problème avec des colonnes comme cela. Elles dédupliquent "naturellement" ces données.