Globalcode – Open4education
Trilha – BigData
Caliel Costa
Nerd, ouvinte de blues, pesquisador, esportista e fotógrafo amad...
Globalcode – Open4education
Agenda
• Geolocation
• Aggregation Pipelines
• MapReduce
• Single Purpose Aggregation Operatio...
Globalcode – Open4education
Superplayer é um serviço de recomendação musical focado em melhorar
todos os momentos da vida ...
Globalcode – Open4education
Web, Android, iOS, Windows Phone, ...
+ 10.000.000
USUÁRIOS ÚNICOS
ACUMULADOS
+ 1.400.000
USUÁRIOS ÚNICOS POR MÊS
+ 4.500.000
VISITAS POR MÊS
TOP
600SITES MAIS
ACESSADOS
DO BRASIL.
Alexa – Traffic Rank
Globalcode – Open4education
Geolocation
Na versão 2.4 (em 2013) foi introduzido o suporte a geometrias GeoJSON,
podendo se...
Globalcode – Open4education
Planeta Terra
Globalcode – Open4education
Planeta Terra
Degrees, Minutes, Seconds to/from Decimal Degrees
Cidade Latitude Longitude
Port...
Globalcode – Open4education
GeoJSON
type coordinates
Point deve ser uma posição simples
MultiPoint deve ser um array de po...
Globalcode – Open4education
GeoJSON - Point
{
"type": "Point",
"coordinates": [100.0, 0.0],
}
Globalcode – Open4education
GeoJSON - LineString
{
"type": "LineString",
"coordinates": [
[100.0, 0.0],
[101.0, 1.0]
],
}
Globalcode – Open4education
GeoJSON - Polygon
{
"type": "Polygon",
"coordinates": [
[
[100.0, 0.0], [101.0, 0.0],
[101.0, ...
Globalcode – Open4education
GeoJSON - MultiPoint
{
"type": "MultiPoint",
"coordinates": [
[100.0, 0.0],
[101.0, 1.0]
],
}
Globalcode – Open4education
GeoJSON - MutiLineString
{
"type": "MultiLineString",
"coordinates": [
[ [100.0, 0.0], [101.0,...
Globalcode – Open4education
GeoJSON - MultiPolygon
{
"type": "MultiPolygon",
"coordinates": [
[
[ [102.0, 2.0], [103.0, 2....
Globalcode – Open4education
Brazil, seus 27 estados e
respectivas capitais
Globalcode – Open4education
GeoJSON - Brasil
{
"_id" : ObjectId("54f4bd437da3100f4454e812"),
"level" : "Country",
"name" :...
Globalcode – Open4education
Longitude e Latitude Vs
Latitude e Longitude
{
"loc" : {
"type" : "Polygon",
"coordinates" : [...
Globalcode – Open4education
Longitude e Latitude Vs
Latitude e Longitude
“All documents must store location data in the sa...
Globalcode – Open4education
Indexando GeoJSON
Tipo Uso
2dsphere Suporta consultas que calculem geometrias em uma esfera ti...
Globalcode – Open4education
Indexando GeoJSON
db.locations.createIndex({
"loc" : "2dsphere"
}, {
"name" : "loc_"
})
• Índi...
Globalcode – Open4education
Consultas GeoJSON
Function Objetivo
$geoWithin Seleciona geometrias dentro dos limites de outr...
Globalcode – Open4education
Onde estou?
query: {
"loc": {
$geoIntersects: {
$geometry: {
type: "Point" ,
coordinates: [-51...
Globalcode – Open4education
Onde estou?
query: {
"loc": {
$geoIntersects: {
$geometry: {
type: "Point" ,
coordinates: [-51...
Globalcode – Open4education
Cidades perto de Gramado/RS
{
"level": "City",
"loc": {
$near: {
$geometry: { type: "Point", c...
Globalcode – Open4education
Cidades perto de Gramado/RS
{
"level": "City",
"loc": {
$near: {
$geometry: { type: "Point", c...
Globalcode – Open4education
$NearSphere
Funciona igual ao Near só que ao invés de se usar
distâncias em metros usa-se em r...
Globalcode – Open4education
Buscando playlists
query: {
$or: [
{ "location": { $not: { $exists: true } } },
{
"location": ...
Globalcode – Open4education
Conteúdo Localizado
• Playlists
• Spots
• Patrocínios de Playlists
• Log de Playlists ouvidas
...
Globalcode – Open4education
Globalcode – Open4education
Aggregation
Operações que processão conjuntos de dados e retornam
dados calculados.
• Aggregat...
Globalcode – Open4education
Aggregation Pipelines
Framework para agregação de dados modelado sob os conceitos de
pipelines
Globalcode – Open4education
Aggregation Pipelines
Comando:
db.collection.aggregate(pipeline, options)
pipeline: []
options...
Globalcode – Open4education
Pipeline Stage Operators
Cada etapa transforma os documentos a medida que estes passam
através...
Globalcode – Open4education
Pipeline Expressions Operators
Especificam transformações aplicadas aos documentos que passam
...
Globalcode – Open4education
Plays por gênero
db.plays.aggregate([
{ $match: { createdat: {
$gte: ISODate("2015-05-01T00:00...
Globalcode – Open4education
Plays por regiões do Brasil
db.plays.aggregate([
{ $match: { createdat: {
$gte: ISODate("2015-...
Globalcode – Open4education
Playlists mais tocadas por
região do Brasil
db.plays.aggregate([
{ $match: { createdat: {
$gte...
Globalcode – Open4education
Globalcode – Open4education
MapReduce
… é um modelo de programação desenhado para processar grandes volumes de
dados em pa...
Globalcode – Open4education
Globalcode – Open4education
Map
Responsável por transformar cada documento em nenhum, 1 ou muitos
documentos.
O melhor é r...
Globalcode – Open4education
Reduce
Ela não pode acessar o banco em hipotese alguma (mesmo que seja para
leitura)
Vai receb...
Globalcode – Open4education
Output Param
Pode ser um literal que será transformada em uma nova coleção
Ou pode indicar uma...
Globalcode – Open4education
Qual dia da semana escuta-se mais
música?
db.plays.mapReduce(function() {
emit(dayOfWeek(this....
Globalcode – Open4education
Voodoo behind MapReduce
Map
Reduce Reduce Reduce
Reduce
Globalcode – Open4education
Plays por regiões do Brasil
db.plays.mapReduce(function() {
this.geolocation.locations.forEach...
Globalcode – Open4education
Plays por Cidade e Sexo
var map = function() {
var key = null;
this.geolocation.locations.forE...
Globalcode – Open4education
Globalcode – Open4education
Single Purpose Aggregation Operations
Operações bem específicas para agregação de dados dispon...
Globalcode – Open4education
Count
Comando:
db.database.count()
db.database.count(query)
Exemplos:
db.plays.count()
db.play...
Globalcode – Open4education
Distinct
Comando:
db.database.distinct(“field”)
db.database.distinct(“field”, query)
Exemplos:...
Globalcode – Open4education
Group
Comando:
db.database.group({
key: <key>,
reduce: <reduce function>,
keyf: <key function>...
Globalcode – Open4education
Número de plays por plataforma
db.plays.group( {
key: { 'consumer.name': 1 },
reduce: function...
Globalcode – Open4education
jointheband@superplayer.fm
Garinpando no MongoDB sem picareta e com elegância
Próximos SlideShares
Carregando em…5
×

Garinpando no MongoDB sem picareta e com elegância

255 visualizações

Publicada em

Apresentação do TDC Porto Alegre 2015, sobre 3 técnicas do MongoDB:
- Dados Geolocalizados
- MapReduce
- Aggregation Pipelines

Publicada em: Tecnologia
0 comentários
3 gostaram
Estatísticas
Notas
  • Seja o primeiro a comentar

Sem downloads
Visualizações
Visualizações totais
255
No SlideShare
0
A partir de incorporações
0
Número de incorporações
4
Ações
Compartilhamentos
0
Downloads
0
Comentários
0
Gostaram
3
Incorporações 0
Nenhuma incorporação

Nenhuma nota no slide

Garinpando no MongoDB sem picareta e com elegância

  1. 1. Globalcode – Open4education Trilha – BigData Caliel Costa Nerd, ouvinte de blues, pesquisador, esportista e fotógrafo amador, desenvolvedor e projetista de soluções em TI. Software Designer no Superplayer. Gabriel Ladeira Sou estudante de Ciências da Computação na PUCRS. Atuo como desenvolvedor a cerca de seis anos, tendo contato com diferentes tecnologias. Atualmente integro a equipe do Superplayer, como backend developer, vivenciando altas aventuras com Mongodb :)
  2. 2. Globalcode – Open4education Agenda • Geolocation • Aggregation Pipelines • MapReduce • Single Purpose Aggregation Operations
  3. 3. Globalcode – Open4education Superplayer é um serviço de recomendação musical focado em melhorar todos os momentos da vida das pessoas através da trilha sonora perfeita. Startup brasileira Criado em 2012
  4. 4. Globalcode – Open4education Web, Android, iOS, Windows Phone, ...
  5. 5. + 10.000.000 USUÁRIOS ÚNICOS ACUMULADOS
  6. 6. + 1.400.000 USUÁRIOS ÚNICOS POR MÊS
  7. 7. + 4.500.000 VISITAS POR MÊS
  8. 8. TOP 600SITES MAIS ACESSADOS DO BRASIL. Alexa – Traffic Rank
  9. 9. Globalcode – Open4education Geolocation Na versão 2.4 (em 2013) foi introduzido o suporte a geometrias GeoJSON, podendo ser usadas em data e consultas.
  10. 10. Globalcode – Open4education Planeta Terra
  11. 11. Globalcode – Open4education Planeta Terra Degrees, Minutes, Seconds to/from Decimal Degrees Cidade Latitude Longitude Porto Alegre -30.03128 30° 1' 52.6074" Sul -51.2125487 51° 12' 45.1764" Oeste São Paulo -23.598877 23° 35' 55.9572" Sul -46.6749596 46° 40' 29.8554" Oeste Londres 51.4994438 51° 29' 57.9978" Norte 0 0° 0' 0" Hong Kong 22.3576782 22° 21' 27.6402" Norte 114.2196956 114° 13' 10.905" Leste
  12. 12. Globalcode – Open4education GeoJSON type coordinates Point deve ser uma posição simples MultiPoint deve ser um array de posição LineString deve ser um array de 2 ou mais posições MultiLineString deve ser um array de array de LineString Polygon deve ser um LinearRing, ou seja um LineString com 4 ou mais pontos, onde o primeiro e o último são posições equivalentes MultiPolygon deve ser um array de array de Polygon
  13. 13. Globalcode – Open4education GeoJSON - Point { "type": "Point", "coordinates": [100.0, 0.0], }
  14. 14. Globalcode – Open4education GeoJSON - LineString { "type": "LineString", "coordinates": [ [100.0, 0.0], [101.0, 1.0] ], }
  15. 15. Globalcode – Open4education GeoJSON - Polygon { "type": "Polygon", "coordinates": [ [ [100.0, 0.0], [101.0, 0.0], [101.0, 1.0], [100.0, 1.0], [100.0, 0.0] ] ], }
  16. 16. Globalcode – Open4education GeoJSON - MultiPoint { "type": "MultiPoint", "coordinates": [ [100.0, 0.0], [101.0, 1.0] ], }
  17. 17. Globalcode – Open4education GeoJSON - MutiLineString { "type": "MultiLineString", "coordinates": [ [ [100.0, 0.0], [101.0, 1.0] ], [ [102.0, 2.0], [103.0, 3.0] ] ] }
  18. 18. Globalcode – Open4education GeoJSON - MultiPolygon { "type": "MultiPolygon", "coordinates": [ [ [ [102.0, 2.0], [103.0, 2.0], [103.0, 3.0], [102.0, 3.0], [102.0, 2.0] ] ], [ [ [100.0, 0.0], [101.0, 0.0], [101.0, 1.0], [100.0, 1.0], [100.0, 0.0] ], [ [100.2, 0.2], [100.8, 0.2], [100.8, 0.8], [100.2, 0.8], [100.2, 0.2] ] ] ] }
  19. 19. Globalcode – Open4education Brazil, seus 27 estados e respectivas capitais
  20. 20. Globalcode – Open4education GeoJSON - Brasil { "_id" : ObjectId("54f4bd437da3100f4454e812"), "level" : "Country", "name" : "Brasil (BR)", "loc" : { "type" : "Polygon", "coordinates" : [ [ [ -44.69501, -1.817778 ], … 336 ... [-44.69501, -1.817778 ] ] ] } }
  21. 21. Globalcode – Open4education Longitude e Latitude Vs Latitude e Longitude { "loc" : { "type" : "Polygon", "coordinates" : [ [ [ -46.53766020909132, -23.36963320731797 ], ..310.. [ -46.53766020909132, -23.36963320731797 ] ] ] } } Cidade Latitude Longitude São Paulo -23.598877 -23° 35' 55.9572" Sul -46.6749596 -46° 40' 29.8554" Oeste
  22. 22. Globalcode – Open4education Longitude e Latitude Vs Latitude e Longitude “All documents must store location data in the same order. If you use latitude and longitude as your coordinate system, always store longitude first. MongoDB’s 2d spherical index operators only recognize [longitude, latitude] ordering.”
  23. 23. Globalcode – Open4education Indexando GeoJSON Tipo Uso 2dsphere Suporta consultas que calculem geometrias em uma esfera tipo a Terra. 2d Gera um geohash de acordo com o valor das coordenadas haystack Este índice é um tipo especial de índice otimizado para retornar resultados sobre areas pequenas
  24. 24. Globalcode – Open4education Indexando GeoJSON db.locations.createIndex({ "loc" : "2dsphere" }, { "name" : "loc_" }) • Índice esparso • Não pode ser usado como chave de sharding
  25. 25. Globalcode – Open4education Consultas GeoJSON Function Objetivo $geoWithin Seleciona geometrias dentro dos limites de outra $geoIntersects Seleciona geometrias em interção com outra $near Retorna objetos na proximidade de um ponto $nearSphere Retorna objetos na proximidade de um ponto na esfera
  26. 26. Globalcode – Open4education Onde estou? query: { "loc": { $geoIntersects: { $geometry: { type: "Point" , coordinates: [-51.2125487, -30.03128] } } } }
  27. 27. Globalcode – Open4education Onde estou? query: { "loc": { $geoIntersects: { $geometry: { type: "Point" , coordinates: [-51.2125487, -30.03128] } } } } Result: Brasil (BR) Rio Grande do Sul (RS) Porto Alegre
  28. 28. Globalcode – Open4education Cidades perto de Gramado/RS { "level": "City", "loc": { $near: { $geometry: { type: "Point", coordinates: [-50.8586806,-29.3851463] } $minDistance: 1, $maxDistance: 300000, }, } }
  29. 29. Globalcode – Open4education Cidades perto de Gramado/RS { "level": "City", "loc": { $near: { $geometry: { type: "Point", coordinates: [-50.8586806,-29.3851463] } $minDistance: 1, $maxDistance: 300000, }, } } Result: Porto Alegre Florianópolis
  30. 30. Globalcode – Open4education $NearSphere Funciona igual ao Near só que ao invés de se usar distâncias em metros usa-se em radianos.
  31. 31. Globalcode – Open4education Buscando playlists query: { $or: [ { "location": { $not: { $exists: true } } }, { "location": { $geoIntersects: { $geometry: { type: "Point" , coordinates: [-47.0562422, -22.9084404] } } } } ], } Result: Acorda, Peão!, Acorda, Vagabundo!, Bebendo no Boteco, Dia de Chuva, Men’s Health, Trabalhando numa Boa, Whiskynho com a Rapaziada, ...
  32. 32. Globalcode – Open4education Conteúdo Localizado • Playlists • Spots • Patrocínios de Playlists • Log de Playlists ouvidas • Log de Músicas (Tracks) ouvidas
  33. 33. Globalcode – Open4education
  34. 34. Globalcode – Open4education Aggregation Operações que processão conjuntos de dados e retornam dados calculados. • Aggregation Pipelines • Map-Reduce • Single Purpose Aggregation Operations
  35. 35. Globalcode – Open4education Aggregation Pipelines Framework para agregação de dados modelado sob os conceitos de pipelines
  36. 36. Globalcode – Open4education Aggregation Pipelines Comando: db.collection.aggregate(pipeline, options) pipeline: [] options: { "explain": <bool>, "allowDiskUse": {batchSize : <bool> }, "cursor": {batchSize : <int> }, } Limitações: Estágios com limite de 100MB de RAM Até a versão 2.6 result set está limitado ao tamanho máximo de um documento BSON (16MB)
  37. 37. Globalcode – Open4education Pipeline Stage Operators Cada etapa transforma os documentos a medida que estes passam através do pipeline. Operadores: $project $match $redact $limit $skip $unwind $group $sort $geoNear $out
  38. 38. Globalcode – Open4education Pipeline Expressions Operators Especificam transformações aplicadas aos documentos que passam pelo pipeline. Principais tipos de operadores: • expreções boleanas - $and, $or; • expreções aplicadas sob conjuntos - $setIntersection, $setUnion; • expreções de comparação - $eq, $gt, $lt, $cmp; • expreções aritiméticos - $add, $subtract; • expreções sob strings - $substr, $toLower; • expreções acumuladoras - $sum, $avg, $max, $min; • expreções condicionais - $cond, $ifNull; • expreções sob data/hora - $dayOfMonth, $month, $year, $hour, $minute.
  39. 39. Globalcode – Open4education Plays por gênero db.plays.aggregate([ { $match: { createdat: { $gte: ISODate("2015-05-01T00:00:00.000Z"), $lte: ISODate("2015-05-31T23:59:59.000Z") } }}, { $group: { _id: "$account.gender", plays: { $sum: 1 }}} ])
  40. 40. Globalcode – Open4education Plays por regiões do Brasil db.plays.aggregate([ { $match: { createdat: { $gte: ISODate("2015-05-01T00:00:00.000Z"), $lte: ISODate("2015-05-31T23:59:59.000Z") } }}, { $unwind: "$geolocation.locations" }, { $project: { _id: "$_id", loc: "$geolocation.locations" }}, { $match: { "loc.level": { $eq: "state" } }}, { $group: { _id: "$loc.name", plays: { $sum: 1 }}} ])
  41. 41. Globalcode – Open4education Playlists mais tocadas por região do Brasil db.plays.aggregate([ { $match: { createdat: { $gte: ISODate("2015-05-01T00:00:00.000Z"), $lte: ISODate("2015-05-31T23:59:59.000Z") } }}, { $unwind: "$playlists" }, { $unwind: "$geolocation.locations" }, { $project: { playlist: "$playlists.name", location: "$geolocation.locations.name" }}, { $group: { _id: { playlist: "$playlist", location: "$location" }, plays: { $sum: 1 }}} ])
  42. 42. Globalcode – Open4education
  43. 43. Globalcode – Open4education MapReduce … é um modelo de programação desenhado para processar grandes volumes de dados em paralelo, dividindo o trabalho em um conjunto de tarefas independentes.
  44. 44. Globalcode – Open4education
  45. 45. Globalcode – Open4education Map Responsável por transformar cada documento em nenhum, 1 ou muitos documentos. O melhor é retornar um documento igual para todas as chaves. Ela não pode acessar o banco em hipótese alguma
  46. 46. Globalcode – Open4education Reduce Ela não pode acessar o banco em hipotese alguma (mesmo que seja para leitura) Vai receber um array de documentos com o mesmo key Deve retornar um documento só O Tipo de retorno deve identico ao tipo de entrada
  47. 47. Globalcode – Open4education Output Param Pode ser um literal que será transformada em uma nova coleção Ou pode indicar uma resposta inline
  48. 48. Globalcode – Open4education Qual dia da semana escuta-se mais música? db.plays.mapReduce(function() { emit(dayOfWeek(this.createdat), 1); }, function(key, values) { return Array.sum(values); }, { out: { inline: 1} });
  49. 49. Globalcode – Open4education Voodoo behind MapReduce Map Reduce Reduce Reduce Reduce
  50. 50. Globalcode – Open4education Plays por regiões do Brasil db.plays.mapReduce(function() { this.geolocation.locations.forEach(function(location) { if (location.level === "state") { emit(location.name, 1); } }); }, function(key, values) { return Array.sum(values); }, { query: { "geolocation.locations": { $exists: true, }, "createdat": { $gte: ISODate("2015-05-01T00:00:00.000Z"), $lte: ISODate("2015-05-31T23:59:59.000Z") } }, out: { inline: 1}, });
  51. 51. Globalcode – Open4education Plays por Cidade e Sexo var map = function() { var key = null; this.geolocation.locations.forEach (function(location) { if (location.level === "city") key = location.name; }); if (key == null) return; var gender = this.account.gender; this.playlists.forEach(function (playlist) { var result = {}; result[gender] = 1; emit(key, result); }); }; var reduce = function(key, values) { var result = { "F": 0, "M": 0, }; values.forEach(function(value) { result["F"] += (value["F"] || 0); result["M"] += (value["M"] || 0); }); return result; }; db.plays.mapReduce(map, reduce, { query: { "account.gender": { $exists: true }, "geolocation. locations": { $exists: true } }, out: "playlist_by_genre", });
  52. 52. Globalcode – Open4education
  53. 53. Globalcode – Open4education Single Purpose Aggregation Operations Operações bem específicas para agregação de dados disponíveis no Mongodb. São elas: Count Retorna o número total de documentos que satisfaz a cosulta informada. Distinct Retorna os valores distintos de um campo sob os documentos resultantes da consulta. Group Agrupa os documentos de uma coleção de acordo com uma chavee específica. Análago ao GROUP BY em SQL.
  54. 54. Globalcode – Open4education Count Comando: db.database.count() db.database.count(query) Exemplos: db.plays.count() db.plays.count({ createdat: { $gte: ISODate("2015-09-25T00:00:00.000Z"), $lte: ISODate("2015-09-25T23:59:59.000Z") }})
  55. 55. Globalcode – Open4education Distinct Comando: db.database.distinct(“field”) db.database.distinct(“field”, query) Exemplos: db.plays.distinct("account.gender") db.plays.distinct("playlists.name", { createdat: { $gte: ISODate("2015-09-25T00:00:00.000Z"), $lte: ISODate("2015-09-25T23:59:59.000Z") } })
  56. 56. Globalcode – Open4education Group Comando: db.database.group({ key: <key>, reduce: <reduce function>, keyf: <key function>, cond: <query>, finalize: <finalize function> }) Limitações: Não é possível de utilizar em coleções com sharding. Result set está limitado ao tamanho máximo de um documento BSON (16MB)
  57. 57. Globalcode – Open4education Número de plays por plataforma db.plays.group( { key: { 'consumer.name': 1 }, reduce: function(cur, result) { result.plays += 1 }, initial: { plays: 0 } })
  58. 58. Globalcode – Open4education jointheband@superplayer.fm

×