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

Querying nosql stores

Jan 22, 2018

Download

Technology

Adilmar Dantas
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
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!