Upload
adilmar-dantas
View
38
Download
0
Embed Size (px)
Citation preview
QueryingNOSQL stores
Autores: Adilmar Dantas Luciana Brito
FACULDADE DE COMPUTAÇÃO
Universidade Federal de Uberlândia
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.
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.
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.
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
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>
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
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
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
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
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.
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();
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();
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.
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?
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.
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.
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.
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});
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” ] }
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})
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.
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();
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();
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} });
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”);
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.
Loading the MovieLens Data
• Como resposta você terá a avaliação e sua respectiva contagemveja:
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.
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.
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.
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.
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.
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.
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.
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 });... };
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 };... };
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.
MapReduce in MongoDB
Por fim terremos o seguinte resultado.
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();
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.
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.
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).
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.
Obrigado!