45
Querying NOSQL stores Autores: Adilmar Dantas Luciana Brito FACULDADE DE COMPUTAÇÃO Universidade Federal de Uberlândia

Querying nosql stores

Embed Size (px)

Citation preview

Page 1: Querying nosql stores

QueryingNOSQL stores

Autores: Adilmar Dantas Luciana Brito

FACULDADE DE COMPUTAÇÃO

Universidade Federal de Uberlândia

Page 2: Querying nosql stores

Introdução

• A linguagem SQL é a linguagem mais simples e mais poderosa especifica criada até agora. Além de ser fácil de se apender, pois ela possui as seguintes características:

• Vocabulário Limitado.

• Gramática sem ambiguidade.

• Sintaxe simples.

• Permitindo facilmente filtrar, classificar, eliminar dados, criar interseções e entidades.

Page 3: Querying nosql stores

Similaridades entre as características de QUERY’s SQL e mongoDB.

• Como alguns desenvolvedores gostariam da presenta de algunselementos do SQL no noSQL, foi criado então linguagens de consultacom sintaxe e estilo que se assemelham ao SQL.

Page 4: Querying nosql stores

Similaridades entre as características de QUERY’s SQL E mongoDB.

• Embora o MongoDB seja um banco de dados de documentos etenha pouca semelhança com um banco de dados relacional, oidioma de consulta do MongoDB se parece muito com o SQL.

Page 5: Querying nosql stores

Querying NOSQL stores

• Para exemplificar vamos carregar a base MOVIELENS, um banco dedados com um milhão de registros contendo classificação de filmes.

O arquivo após descompactado contém três arquivos:

movies.dat

ratings.dat

users.dat

Page 6: Querying nosql stores

Querying NOSQL stores

Este arquivo contém os dados sobre os filmes e possui 3952registros, e cada linha neste arquivo contém um registro, salvo daseguinte maneira.

Movies.dat

<MovieID>::<Title>::<Genres>

Page 7: Querying nosql stores

Querying NOSQL stores

Movieid -> Sequência inteira de números.

Title -> Uma String que inclui o ano em que o filme foi lançadoentra parênteses anexado ao seu nome. Os títulos são os mesmosdo IMDB.

*Cada filme pode ser classificado em vários gêneros, que sãoespecificados por um delimitador.

Movies.dat

Toy Story (1995)::Animation|Children’s|Comedy

Page 8: Querying nosql stores

Querying NOSQL stores

Contém as classificações dos 3.952 filmes por mais de 6.000usuários. O arquivo de classificação possui mais de 1 milhão deregistros. Cada linha é um registro diferente que contém dados noseguinte formato:

Ratings.dat

UserID::MovieID::Rating::Timestamp

Page 9: Querying nosql stores

Querying NOSQL stores

• UserID e MovieID identificam e estabelecem um relacionamentocom o usuário e o filme, respectivamente. A classificação é umamedida em uma escala de 5 pontos (5 estrelas).

• Timestamp captura o tempo em que as classificações foramgravadas.

Ratings.dat

Page 10: Querying nosql stores

Querying NOSQL stores

• O arquivo users.dat contém dados sobre os usuários queavaliaram os filmes. Ele possui mais de 6.000 usuários e é gravadano seguinte formato:

User.dat

UserID::Gender::Age::Occupation::Zip-code

Page 11: Querying nosql stores

Loading the MovieLens Data

• Para simplificar faça o upload das três coleções de dados (movies,ratings, e users) mapeado para o arquivo dados.dat.

• A base é delimitada por (::)

• Feito isso utiliza-se uma linguagem de programação e o drivermongoDB para analisar e carregar o arquivo de dados.

• Em geral as linguagens mais utilizadas para esta finalidade são:Ruby, Python (muito bem indentado), Java, PHP, C e etc.

Page 12: Querying nosql stores

Loading the MovieLens Data

• Para começar a consultar as coleções MongoDB, inicie o servidorMongoDB e conecte-se a ele usando o shell Mongo.

• Os programas necessários são acessíveis a partir da pasta bin da suainstalação do MongoDB.

• No seu shell de JavaScript do Mongo, primeiro obtenha umacontagem de todos os valores da coleção de classificações daseguinte maneira:

db.ratings.count();

Page 13: Querying nosql stores

Loading the MovieLens Data

• Como resposta você terá algo como 1000209, mais de um milhão declassificações indicam que foram carregadas corretamente.

• Para obter o conjunto de amostra de dados de classificação, utilize oseguinte comando.

db.ratings.find();

Page 14: Querying nosql stores

Loading the MovieLens Data

• Os dados de classificação retornara algo parecido com:

• O resultado estão ligados ao id do filme e não ao seu titulo isto nãoparece ser uma boa solução, para contornar esse problemaresponderemos as seguintes perguntas.

Page 15: Querying nosql stores

Loading the MovieLens Data

• Como obter todos os dados de classificação para um determinadofilme?

• Como obter as informações do filme para uma classificaçãodeterminada?

• Como juntar uma lista de todos os filmes com os dados declassificação agrupados pelos filmes com os quais eles serelacionam?

Page 16: Querying nosql stores

Loading the MovieLens Data

• Em bancos de dados relacionais, esses tipos de relações sãorealizadas usando junções. No MongoDB, esses dados relacionaissão explicitamente correlacionados fora do escopo do servidor.

• O MongoDB define o conceito de um DBRef para estabelecer umarelação entre dois campos de duas coleções separadas, mas esserecurso possui algumas limitações e não fornece o mesmo poderque o link explícito baseado em id.

Page 17: Querying nosql stores

Loading the MovieLens Data

• Para obter todos os dados de classificação para um determinadofilme, você filtra o conjunto de dados usando o ID do filme comocritério.

• Por exemplo, para ver todas as classificações para o famoso filmeTitanic premiado com o Oscar, você precisa primeiro encontrar seuid e depois usar isso para filtrar a coleção de classificações.

Page 18: Querying nosql stores

Loading the MovieLens Data

• Se você não tem certeza de qual é a sequência de título exata para"Titanic", mas você está confiante da palavra titanic nele podetentar uma combinação aproximada e não exata com as os título nacoleção de filmes.

• Em um RDBMS, para encontrar o id do filme em tais circunstâncias,é provável que você use uma expressão similar ao SQL whereclausepara obter uma lista de todos os candidatos possíveis.

Page 19: Querying nosql stores

Loading the MovieLens Data

• No MongoDB, não há nenhuma expressão semelhante, mas existeum recurso mais poderoso disponível, que é a capacidade de definirum padrão usando expressões regulares.

• Então, para obter uma lista de todos os registros na coleção defilmes que têm Titanic ou titanic em seu título, você pode consultarassim:

db.movies.find({ title: /titanic/i});

Page 20: Querying nosql stores

Loading the MovieLens Data

• A QUERY ira retornar os seguintes documentos:

• { “_id” : 1721, “title” : “Titanic (1997)”, “genres” : [ “Drama”, “Romance” ] }

• { “_id” : 2157, “title” : “Chambermaid on the Titanic, The (1998)”, “genres” :

• “Romance” }

• { “_id” : 3403, “title” : “Raise the Titanic (1980)”, “genres” : [ “Drama”,

• “Thriller” ] }

• { “_id” : 3404, “title” : “Titanic (1953)”, “genres” : [ “Action”, “Drama” ] }

Page 21: Querying nosql stores

Loading the MovieLens Data

• O campo de título no conjunto de dados MovieLens inclui o ano emque o filme foi lançado. Dentro do campo de título esta também oano de lançamento está incluído entre parênteses.

• Então, se você se lembrou ou sabia que o Titanic foi lançado no anode 1997, você pode escrever uma expressão de consulta maisajustada da seguinte maneira:

db.movies.find({title: /titanic.*\(1997\).*/i})

Page 22: Querying nosql stores

Loading the MovieLens Data

• Você terá como resultado exatamente o filme que procurava.

• { “_id” : 1721, “title” : “Titanic (1997)”, “genres” : [ “Drama”, “Romance” ] }

• A expressão regular utilizado procura os título que possuem Titanic, titanic,TitaniC ou TiTAnicin. Em suma, ele ignora o caso. Além disso, procura astring (1997). Ele também afirma que isso pode ser 0 ou mais caracteresentre titanic e (1997) e depois (1997).

• O suporte para expressões regulares é uma característica poderosa esempre vale a pena ganhar domínio sobre eles.

Page 23: Querying nosql stores

Loading the MovieLens Data

• Então, para obter todas as classificações para o filme Titanic, quetem um id de 1721, você pode fazer assim:

• Para descobrir o número de classificações disponíveis para o Titanic,você pode contá-las da seguinte maneira:

db.ratings.find({ movie_id: 1721 });

db.ratings.find({ movie_id: 1721 }).count();

Page 24: Querying nosql stores

Loading the MovieLens Data

• A resposta à contagem é 1546. As avaliações estão em uma escalade 5 pontos. Para obter uma lista e contar apenas as avaliações de 5estrelas para o filme Titanic, você pode filtrar ainda mais o conjuntode registros, assim:

db.ratings.find({ movie_id: 1721 });

db.ratings.find({ movie_id: 1721, rating: 5 })

db.ratings.find({ movie_id: 1721, rating: 5 }).count();

Page 25: Querying nosql stores

Loading the MovieLens Data

• Para obter uma estatística de todas as classificações para o Titanic.(do possível conjunto de números inteiros entre 1 e 5, ambosinclusivos), você pode consultar fazendo as seguintes etapas:

• As classificações para Titanic incluem todos os casos possíveis entre1 e 5 (ambos inclusivos), você terá como resposta:

• { “values” : [ 1, 2, 3, 4, 5 ], “ok” : 1 }

db.runCommand({ distinct: ‘ratings’, key: ‘rating’, query: { movie_id: 1721} });

Page 26: Querying nosql stores

Loading the MovieLens Data

• runCommand é um padrão diferente do que o estilo de consultaque você esta acostumado porque a coleção é filtrada antes que osvalores distintos sejam pesquisados.

• Valores distintos para todas as avaliações na coleção podem serlistados da maneira que você viu até agora, da seguinte forma:

db.ratings.distinct(“rating”);

Page 27: Querying nosql stores

Loading the MovieLens Data

• Você já sabe que o filme Titanic possui as 5 classificações distintaspossíveis, para velas agrupadas com a quantidade de classificaçõesvocê pode construir a seguinte Query.

Page 28: Querying nosql stores

Loading the MovieLens Data

• Como resposta você terá a avaliação e sua respectiva contagemveja:

Page 29: Querying nosql stores

Loading the MovieLens Data

• Use o recurso MapReduce do MongoDB para executar funções deagrupamento em um MongoDB distribuído. Uma versãoMapReduce da função de agrupamento é incluída logo após aoperação do group.

• MapReduce: é um modelo de programação desenhado paraprocessar grandes volumes de dados em paralelo, dividindo otrabalho em um conjunto de tarefas independentes.

Page 30: Querying nosql stores

Loading the MovieLens Data

• A operação em group leva um objeto como entrada. Este objeto deoperação em grupo inclui os seguintes campos:

• Key – chave do elemento.

• Initial – para a agregação do contador, neste caso iniciado com 0.

• cond — A query de condição.

• reduce — Função de agregação.

• keyf (opcional) — Uma chave alternativa caso a key não seja valida.

• finalize (optional) — Função para finalizar a cada interação.

Page 31: Querying nosql stores

Loading the MovieLens Data

• Podemos facilmente transformar um caso em que as classificações paracada filme são agrupadas pelos pontos de classificação usandosimplesmente a seguinte operação de group:

• Em casos reais, porém, isso não funcionaria para um banco com 1 milhãode registros. Você seria surpreendido com a seguinte mensagem de erro.

Page 32: Querying nosql stores

Loading the MovieLens Data

O resultado é retornado como um único objeto BSON e, portanto, acoleção sobre a qual a operação do grupo é aplicada não deve ter maisde 10.000 chaves. Essa limitação também pode ser superada com afunção MapReduce.

Page 33: Querying nosql stores

MapReduce in MongoDB

• Conforme comentado anteriormente o MapReduce é umaestrutura de software patenteada do Google que suportacomputação distribuída.

• A estrutura MapReduce do Google inspirou muitas outrasestruturas de computação distribuídas na comunidade open-source. MongoDB's é um desses.

• Os recursos MapReduce do Google e do MongoDB também sãoinspirados por construções similares no mundo da programaçãofuncional.

Page 34: Querying nosql stores

MapReduce in MongoDB

Os recursos MapReduce do MongoDB não são um clone do MapReduce doGoogle. O MapReduce do Hadoop é uma implementação de fonte aberta deIdeias de computação distribuída do Google e inclui infraestrutura parabancos de dados de colunas (HBase) e computação baseada emMapReduce.

Page 35: Querying nosql stores

MapReduce in MongoDB

• O exemplo de agregação mais simples é uma contagem de cada tipo de itemem uma coleção. Para usar MapReduce, você precisa definir uma função demap e uma função de redução e, em seguida, executar o map e reduzir asfunções de uma coleção.

• Uma função de map aplica uma função a cada membro da coleção e emite umpar de chave / valor para cada membro como resultado desse processo.

• A saída de chave / valor de uma função de map é consumida pela função deredução.

• A função de redução executa a função de desagregação em todos os pares dechaves / valores e gera um resultado por sua vez.

Page 36: Querying nosql stores

MapReduce in MongoDB

• O map funciona para contar o número de entrevistados femininos (F) emaculinos (M) na base de usuários.

Esta função de map emite um par de chaves / valores para cada item na coleção que possui uma propriedade de gênero (M/F), contando 1 para cada ocorrência.

> var map = function() {... emit({ gender:this.gender }, { count:1 });... };

Page 37: Querying nosql stores

MapReduce in MongoDB

• A função de redução para contar o número de ocorrências totais dos tiposmasculino e feminino entre todos os usuários é a seguinte:

> var reduce = function(key, values) {... var count = 0;... values.forEach(function(v) {... count += v[‘count’];... });... ... return { count:count };... };

Page 38: Querying nosql stores

MapReduce in MongoDB

• A função de redução leva um par de chave / valor emitido pela função demap. Nesta função de redução particular, cada valor no par de chave / valoré passado através de uma função que conta o número de ocorrências de umtipo específico.

• A contagem de linha + = v ['count'] também pode ser escrita comocount + = v.count por causa da habilidade de JavaScript para acessar osmembros do objeto e seus valores como uma estrutura de dados hash.

Page 39: Querying nosql stores

MapReduce in MongoDB

Por fim terremos o seguinte resultado.

Page 40: Querying nosql stores

MapReduce in MongoDB

• Para verificar a saída contando o números de pessoas para cada um dosgêneros (M) e (F) basta usar o seguinte script.

db.users.find({ “gender”:”F” }).count();

db.users.find({ “gender”:”M”}).count();

Page 41: Querying nosql stores

MapReduce in MongoDB

• Você pode modificar o script para que ele conte o número de classificações(1, 2, 3, 4, 5) da seguinte maneira.

Page 42: Querying nosql stores

MapReduce in MongoDB

• O MapReduce permite que você escreva muitos algoritmos para otimizarsuas buscas em banco de dados distribuidos e com grande volumes dedados.

• Pense executar essas buscar em um banco relacional simples sem o uso detécnicas o tempo gasto e a quantidade de infraestrutura necessária paraotimizar essas consultas.

Page 43: Querying nosql stores

Hbase

• Hbase

• É um banco de dados distribuído open-source orientado a coluna, modeladoa partir do Google BigTable e escrito em Java.

• O Hbase tem fácil integração com o Hadoop, sendo assim, pode ser utilizadoo MapReduce para distribuir o processamento dos dados, podendoprocessar facilmente vários terabytes de dados.

• Fácil integração com linguagens como (Java, Python, Ruby, ect).

Page 44: Querying nosql stores

Referencias

Shashank Tiwari. 2011. Professional NoSQL. Wrox Press Ltd., Birmingham, UK, UK.

MONGODB. MongoDB DOC. 2017. Disponível em: <https://docs.mongodb.com/>. Acesso em: 01 nov. 2017.

SADALAGE, Pramod J.; FOWLER, Martin. NoSQL Essencial: Um Guia Conciso para o Mundo Emergente da Persistência Poliglota. São Pualo: Novatec, 2013. 216 p.

Page 45: Querying nosql stores

Obrigado!