Big-Data-Technology MongoDB Fabian Bielmeier, David Claybourne, Reinhard Stampp, Denis Wolf
Datenmodellierung
Datenmodellierung in MongoDB Documents Collection Database
Unser Datenmodell Database Collection Documents Flughafen Tickets 00QKXC 00D3N0
Datenmodellierung - JSON-Struktur (1) { "_id" : "00ZH5M", "passengers" : [ "lastname" : "Rauss", "firstname" : "Armin", "type" : "Mr" } ], "flights" : [ "departs" : { "date" : "2013-04-04", "time" : "06:50" }, "airline" : "Lufthansa", "arrives" : { "time" : "08:00" "flight" : "LH2023", "from" : { "airport" : "DUS", "city" : "Dusseldorf, Germany" }, "to" : { "airport" : "MUC", "terminal" : "Terminal 2", "city" : "Munich, Germany" "baggage" : "ADT 1PC", "class" : "Economy (B)", "duration" : "01:10", "status" : "Confirmed", "aircraft" : "Airbus Industrie A320-100/200", "services" : { "etickets" : [ "2203272401000C1" ], "seats" : [ "07D" ] }
Datenmodellierung - JSON-Struktur (2) "fares" : { "segment" : [ 1, 2 ], "name:" : { "lastname" : "Rauss", "firstname" : "Armin", "type" : "Mr" }, "type" : "ADT", "fop" : "INVOICE", "currency" : "EUR", "base" : "667.00", "taxes" : "260.91", "total" : "927.91" }
Importieren der Daten MongoDB kann JSON Dateien mit Hilfe des Befehls „mongoimport“ importieren: mongoimport --db flughafen --collection tickets –type json –file file.json
Datenbankabfragen
Datenbankabfrage-Befehl Zum Abfragen der Datenbank wird der Befehl „find“ benutzt Beispiel: db.tickets.find({"_id":/^009GH1$/i}).pretty() database collection find()
Datenbankabfragen (1) Alle Buchungen, die noch nicht ausgestellt wurden (d.h. kein Preis vorhanden): db.tickets.find({"fares" : {$exists : false}}).pretty() Alle Buchungen mit mehr als einem Passagier: db.tickets .find({$where : "this.passengers.length > 1"}).pretty() Alle Buchungen, bei denen der Flug in Dusseldorf (DUS) begonnen wird: db.tickets.find({"flights.0.from.airport" : "DUS"}).pretty() Die Anzahl der Buchungen, bei denen der Flug in Dusseldorf (DUS) begonnen wurde: db.tickets.find({"flights.0.from.airport" : "DUS"}).count()
Datenbankabfragen (2) Den Buchungssatz mit der Ticketnummer 2203272401000: db.tickets .find({"flights.services.etickets„ : /2203272401000/i}).pretty() Alle Buchungen, die kein Direktflug sind (d.h. mit Umsteigen): .find({ $where : "this.flights.length > 1 && this.flights[0].to.airport == this.flights[1].from.airport && this.flights[0].from.airport != this.flights[1].to.airport"}) .pretty() Alle Buchungen, die ein One-Way sind (d.h. ohne Rückflug): .find("this.flights[0].from.airport != this.flights[this.flights.length-1].to.airport").pretty()
Verteilte Anfragen auf großen Datenmengen Praktikum 3 + 4
Datenimport Erzeugen von JSON-Dateien mit 1 Millionen 5 Millionen …. Datensätzen durch eigenes Python-Skript Import und Zeitmessung durch: time mongoimport --db flughafen --collection tickets --type json --file data.json Größe der Collection mit: db.tickets.stats();
Durchschnittsberechnung mit MapReduce db.average.drop(); var startTime = new Date(); db.tickets.mapReduce( function() { if (this.fares != null && this.fares.taxes != null) emit({}, {sum: this.fares.taxes, num: 1}); else emit({}, {sum: 0, num: 0}); }, function(name, values) { var n = {sum: 0, num: 0}; for (var i = 0; i < values.length; i++) { n.sum += values[i].sum; n.num += values[i].num; } return n; { finalize: function(who, res) { res.avg = res.sum / res.num; return res; out: "average" ); print((new Date - startTime) / 1000 + "sec"); db.average.find().pretty();
Auswertung Datensätze Zeit für Import Größe der Collection Zeit für Berechnung 1 Millionen 78.080s 1,11GB 11.232s 5 Millionen 450.123s 5,557GB 56.429s 10 Millionen 1051.336s 11,1GB 105.966s 15 Millionen 1834.627s 16,925GB 156.796s 20 Millionen 2493.826s 22,318GB 210.983s