Questo è il quinto webinar della serie Back to Basics che ti offrirà un'introduzione al database MongoDB. Con questo webinar ti presentiamo Aggregation Framework.
3. Riassunto
• Webinar 1 – Introduzione a NoSQL
– I diversi tipi di database NoSQL
– MongoDB come document database
• Webinar 2 – La nostra prima applicazione
– Creazione di database e collectione
– CRUD, indici e explain
• Webinar 3 – Schema Design
– Schema dinamico
– Approcci all’Embedding
• Webinar 4 –Indici Full-Text e geospaziali
4. L’Aggregation Framework
• Motore anallitico per MongoDB
• Pensate ai due tipi di database: OLTP e OLAP
• OLTP : Online Transaction Processing
– Prenotazione voli,
– Bancomat,
– Prenotazione taxi
• OLAP : Online Analytical Processing
– Quale biglietto ci fa guadagnare di più?
– Quando dobbiam ricaricare il bancomat?
– Di quanti taxi abbiamo bisogno per effettuare il servizio ad est di Milano?
6. OLAP - There Be (Hadoop) Dragons Here
• Query OLAP sono spesso scansioni di tabelle
• L’output delle query è spesso strutturato per analisi future e
comparazioni
• Molti clienti stanno guardando a Spark e Hadoop ma:
– La complessità è astronomica
– Focus sugli algoritmi di analisi dei dati (dovete scrivere un programma)
– Richiede una certa conoscenza di algoritmi paralleli
• L’aggregation framework è un tool molto più ”gentile”
• L’obiettivo è di fare quello che volete fare in meno temppo
7. Analytics on MongoDB Data
• Extract data from MongoDB and
perform complex analytics with
Hadoop
– Batch rather than real-time
– Extra nodes to manage
• Direct access to MongoDB from
SPARK
• MongoDB BI Connector
– Direct SQL Access from BI Tools
• MongoDB aggregation pipeline
– Real-time
– Live, operational data set
– Narrower feature set
Hadoop
Connector
MapReduce & HDFS
SQL
Connector
8. What is an Aggregation Pipeline?
• Una serie di trasformazioni di documenti
– Eseguita in stage
– L’input iniziale è una collection
– L’output può essere un cursorse o una collection
• Ricca libreria di funzioni
– Filter, compute, group e summarize data
– L’output di uno stage è l’input dello stage successivo
– Le operazioni sono eseguite in ordine sequenziale
9. Operatori della Pipeline
• $match
Filter documents
• $geoNear
Geospherical query
• $project
Reshape documents
• $lookup
New – Left-outer equi joins
• $unwind
Expand documents
• $group
Summarize documents
• $sample
New – Randomly selects a subset of
documents
• $sort
Order documents
• $skip
Jump over a number of documents
• $limit
Limit number of documents
• $redact
Restrict documents
• $out
Sends results to a new collection
18. Esempio: US Census Data
• Census data dal 1990, 2000, 2010
• Domande:
– Quale US Division è la densità con il piu alto tasso di crescita?
– Division = a group of US States
– Population density = Area of division/# of people
– Data is provided at the state level
22. $group
• Raggruppa i documenti per valore
– Field reference, object, constant
– Calcoli altri campi di output
• $max, $min, $avg, $sum
• $addToSet, $push
• $first, $last
– Processa tutti i dati in memoria di default
25. Popolazione US Totale per Anno
db.cData.aggregate([
{$unwind : "$data"},
{$group : {
"_id" : "$data.year",
"totalPop" : {$sum :"$data.totalPop"}}},
{$sort : {"totalPop" : 1}}
])
26. $unwind
• Opera su un campo array
– Crea documenti dagli elementi dell’array
• Gli Array sono sostituiti dal valore degli elementi
• Se il campo array manca → no output
• Se il campo non è un array → errore
– Pipe a $group per aggregare
31. $sort, $limit, $skip
• Ordina I documenti per uno o più campi
– Stessa sintassi dei cursori
– Aspetta la piepeline precedente
– In-memory se non all’inizio della pipeline e indicizzato
• Limit e skip stesso comportamento dei
cursori
34. $geoNear
• Ordina/Filtra Documenti per posizione
– Richiede un indice geospaziale
– L’Output include la distanza fisica
– Deve essere il primo stage di aggregazione
36. Opzioni di Aggregate
db.cData.aggregate([<pipeline stages>],
{‘explain’ : false
'allowDiskUse' : true,
'cursor' : {'batchSize' : 5}})
• explain – simile a find().explain()
• allowDiskUse – Abilita l’uso del disco
• cursor – specifica la taglia del risultato iniziale
37. Sharding
• Carico diviso tra gli shard
– Shard eseguono la pipeline fino
ad un certo punto
– Lo shard primario unisce I
cursori e continua il processing
– Usate explain per analizzare lo
split della pipeline
– $match inziale può escludere
alcuni shard inutili
*Prior to v2.6 second stage pipeline processing was
done by mongos
38. Alternative Esistenti alle Join
{ "_id": 10000,
"items": [
{ "productName": "laptop",
"unitPrice": 1000,
"weight": 1.2,
"remainingStock": 23},
{ "productName": "mouse",
"unitPrice": 20,
"weight": 0.2,
"remainingStock": 276}],
…
}
• Option 1: Includere tutti I dati
di un ordine nello stesso
documento
– Fast read
• Una find ritorna tutti I dati richiesti
– Consuma spazio extra
• I dettagli di ogni prodotti sono in tanti
ordini
– Complesso da mantenere
• Un cambiamento di un attrobuto di un
prodotto deve essere propagato all’interno
degli ordini
orders
39. Alternative Esistenti alle Join
{
"_id": 10000,
"items": [
12345,
54321
],
...
}
• Option 2: Il documento degli
ordini referenzia I documenti
dei prodotti
– Read piu lente
• Multiple trips al database
– Efficiente uso dello spazio
• I dettagli dei prodotti sono memorizzati una
volta sola
– Perde point-in-time snapshot di tutto il record
– Logica nell’applicazione
• Deve iterare sull’ID prodotto per trovare
tutti I documenti dei prodotti
• RDBMS automatizza con unaJOIN
orders
{
"_id": 12345,
"productName": "laptop",
"unitPrice": 1000,
"weight": 1.2,
"remainingStock": 23
}
{
"_id": 54321,
"productName": "mouse",
"unitPrice": 20,
"weight": 0.2,
"remainingStock": 276
}
products
40. Il vincitore?
• In generale, Opzione 1 vince
– Performance e il contenere tutto in un solo posto batte l’efficienza dello
spazio e la normalizzazione
– Ci sono eccezioni
• e.g. Commenti in un blog post -> unbounded size
• Tuttavia l’Analytics può beneficiare del combinare I dati di
diverse collection
41. $lookup
• Left-outer join
– Include tutti I documenti della
collection di sinistra
– Per ogni documenti della
collection di sinistra trova I
documenti corrispondenti dalla
collection di destra e li
incapsula
Left Collection Right Collection
44. Sommario
• A pipeline di operazioni
• Select, project, group, sort
• $out deve essere l’ultimo operatore
• Ci sono vari tipi di accumulatori (guardate la documentazione
di $group)
• Sistema molto potente per analizzare e trasformare i dati
• Shard aware per avere il massimo del guadagno dai grandi
cluster