SlideShare uma empresa Scribd logo
Querying
NOSQL 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 alguns
elementos do SQL no noSQL, foi criado então linguagens de consulta
com 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 e
tenha pouca semelhança com um banco de dados relacional, o
idioma de consulta do MongoDB se parece muito com o SQL.
Querying NOSQL stores
• Para exemplificar vamos carregar a base MOVIELENS, um banco de
dados 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 3952
registros, e cada linha neste arquivo contém um registro, salvo da
seguinte 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çado
entra parênteses anexado ao seu nome. Os títulos são os mesmos
do IMDB.
*Cada filme pode ser classificado em vários gêneros, que são
especificados 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.000
usuários. O arquivo de classificação possui mais de 1 milhão de
registros. Cada linha é um registro diferente que contém dados no
seguinte formato:
Ratings.dat
UserID::MovieID::Rating::Timestamp
Querying NOSQL stores
• UserID e MovieID identificam e estabelecem um relacionamento
com o usuário e o filme, respectivamente. A classificação é uma
medida em uma escala de 5 pontos (5 estrelas).
• Timestamp captura o tempo em que as classificações foram
gravadas.
Ratings.dat
Querying NOSQL stores
• O arquivo users.dat contém dados sobre os usuários que
avaliaram os filmes. Ele possui mais de 6.000 usuários e é gravada
no 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 driver
mongoDB 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 servidor
MongoDB e conecte-se a ele usando o shell Mongo.
• Os programas necessários são acessíveis a partir da pasta bin da sua
instalação do MongoDB.
• No seu shell de JavaScript do Mongo, primeiro obtenha uma
contagem de todos os valores da coleção de classificações da
seguinte maneira:
db.ratings.count();
Loading the MovieLens Data
• Como resposta você terá algo como 1000209, mais de um milhão de
classificações indicam que foram carregadas corretamente.
• Para obter o conjunto de amostra de dados de classificação, utilize o
seguinte 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ão
parece ser uma boa solução, para contornar esse problema
responderemos as seguintes perguntas.
Loading the MovieLens Data
• Como obter todos os dados de classificação para um determinado
filme?
• Como obter as informações do filme para uma classificação
determinada?
• Como juntar uma lista de todos os filmes com os dados de
classificação agrupados pelos filmes com os quais eles se
relacionam?
Loading the MovieLens Data
• Em bancos de dados relacionais, esses tipos de relações são
realizadas usando junções. No MongoDB, esses dados relacionais
são explicitamente correlacionados fora do escopo do servidor.
• O MongoDB define o conceito de um DBRef para estabelecer uma
relação entre dois campos de duas coleções separadas, mas esse
recurso possui algumas limitações e não fornece o mesmo poder
que o link explícito baseado em id.
Loading the MovieLens Data
• Para obter todos os dados de classificação para um determinado
filme, você filtra o conjunto de dados usando o ID do filme como
critério.
• Por exemplo, para ver todas as classificações para o famoso filme
Titanic premiado com o Oscar, você precisa primeiro encontrar seu
id 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 pode
tentar uma combinação aproximada e não exata com as os título na
coleçã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 whereclause
para obter uma lista de todos os candidatos possíveis.
Loading the MovieLens Data
• No MongoDB, não há nenhuma expressão semelhante, mas existe
um recurso mais poderoso disponível, que é a capacidade de definir
um padrão usando expressões regulares.
• Então, para obter uma lista de todos os registros na coleção de
filmes que têm Titanic ou titanic em seu título, você pode consultar
assim:
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 em
que o filme foi lançado. Dentro do campo de título esta também o
ano de lançamento está incluído entre parênteses.
• Então, se você se lembrou ou sabia que o Titanic foi lançado no ano
de 1997, você pode escrever uma expressão de consulta mais
ajustada 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 a
string (1997). Ele também afirma que isso pode ser 0 ou mais caracteres
entre titanic e (1997) e depois (1997).
• O suporte para expressões regulares é uma característica poderosa e
sempre vale a pena ganhar domínio sobre eles.
Loading the MovieLens Data
• Então, para obter todas as classificações para o filme Titanic, que
tem 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 escala
de 5 pontos. Para obter uma lista e contar apenas as avaliações de 5
estrelas para o filme Titanic, você pode filtrar ainda mais o conjunto
de 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, ambos
inclusivos), você pode consultar fazendo as seguintes etapas:
• As classificações para Titanic incluem todos os casos possíveis entre
1 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 consulta
que você esta acostumado porque a coleção é filtrada antes que os
valores distintos sejam pesquisados.
• Valores distintos para todas as avaliações na coleção podem ser
listados 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 distintas
possíveis, para velas agrupadas com a quantidade de classificações
você pode construir a seguinte Query.
Loading the MovieLens Data
• Como resposta você terá a avaliação e sua respectiva contagem
veja:
Loading the MovieLens Data
• Use o recurso MapReduce do MongoDB para executar funções de
agrupamento em um MongoDB distribuído. Uma versão
MapReduce da função de agrupamento é incluída logo após a
operação do group.
• MapReduce: é um modelo de programação desenhado para
processar grandes volumes de dados em paralelo, dividindo o
trabalho em um conjunto de tarefas independentes.
Loading the MovieLens Data
• A operação em group leva um objeto como entrada. Este objeto de
operaçã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 para
cada filme são agrupadas pelos pontos de classificação usando
simplesmente a seguinte operação de group:
• Em casos reais, porém, isso não funcionaria para um banco com 1 milhão
de registros. Você seria surpreendido com a seguinte mensagem de erro.
Loading the MovieLens Data
O resultado é retornado como um único objeto BSON e, portanto, a
coleção sobre a qual a operação do grupo é aplicada não deve ter mais
de 10.000 chaves. Essa limitação também pode ser superada com a
função MapReduce.
MapReduce in MongoDB
• Conforme comentado anteriormente o MapReduce é uma
estrutura de software patenteada do Google que suporta
computação distribuída.
• A estrutura MapReduce do Google inspirou muitas outras
estruturas de computação distribuídas na comunidade open-
source. MongoDB's é um desses.
• Os recursos MapReduce do Google e do MongoDB também são
inspirados por construções similares no mundo da programação
funcional.
MapReduce in MongoDB
Os recursos MapReduce do MongoDB não são um clone do MapReduce do
Google. O MapReduce do Hadoop é uma implementação de fonte aberta de
Ideias de computação distribuída do Google e inclui infraestrutura para
bancos de dados de colunas (HBase) e computação baseada em
MapReduce.
MapReduce in MongoDB
• O exemplo de agregação mais simples é uma contagem de cada tipo de item
em uma coleção. Para usar MapReduce, você precisa definir uma função de
map e uma função de redução e, em seguida, executar o map e reduzir as
funções de uma coleção.
• Uma função de map aplica uma função a cada membro da coleção e emite um
par 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 de
redução.
• A função de redução executa a função de desagregação em todos os pares de
chaves / valores e gera um resultado por sua vez.
MapReduce in MongoDB
• O map funciona para contar o número de entrevistados femininos (F) e
maculinos (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 tipos
masculino 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 de
map. 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 um
tipo específico.
• A contagem de linha + = v ['count'] também pode ser escrita como
count + = v.count por causa da habilidade de JavaScript para acessar os
membros 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 dos
gê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 otimizar
suas buscas em banco de dados distribuidos e com grande volumes de
dados.
• Pense executar essas buscar em um banco relacional simples sem o uso de
técnicas o tempo gasto e a quantidade de infraestrutura necessária para
otimizar essas consultas.
Hbase
• Hbase
• É um banco de dados distribuído open-source orientado a coluna, modelado
a partir do Google BigTable e escrito em Java.
• O Hbase tem fácil integração com o Hadoop, sendo assim, pode ser utilizado
o MapReduce para distribuir o processamento dos dados, podendo
processar 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!

Mais conteúdo relacionado

Semelhante a Querying nosql stores

364722271-Modulo-III-Linguagem-SQL-Versao-Final.pdf
364722271-Modulo-III-Linguagem-SQL-Versao-Final.pdf364722271-Modulo-III-Linguagem-SQL-Versao-Final.pdf
364722271-Modulo-III-Linguagem-SQL-Versao-Final.pdf
QuitriaSilva550
 
Minicurso Epoca mongoDB
Minicurso Epoca mongoDBMinicurso Epoca mongoDB
Minicurso Epoca mongoDB
LelyBarros
 
Processos iniciais do mapeamento OR
Processos iniciais do mapeamento ORProcessos iniciais do mapeamento OR
Processos iniciais do mapeamento OR
Nécio de Lima Veras
 

Semelhante a Querying nosql stores (20)

Introducao a aws storage backup e archiving
Introducao a aws storage backup e archivingIntroducao a aws storage backup e archiving
Introducao a aws storage backup e archiving
 
Tema3.pptx
Tema3.pptxTema3.pptx
Tema3.pptx
 
Tema3.pptx
Tema3.pptxTema3.pptx
Tema3.pptx
 
Bancos de dados NoSQL (Not only sql)
Bancos de dados NoSQL (Not only sql)Bancos de dados NoSQL (Not only sql)
Bancos de dados NoSQL (Not only sql)
 
Utilizando NoSQL para Big Data com DynamoDB
Utilizando NoSQL para Big Data com DynamoDB Utilizando NoSQL para Big Data com DynamoDB
Utilizando NoSQL para Big Data com DynamoDB
 
364722271-Modulo-III-Linguagem-SQL-Versao-Final.pdf
364722271-Modulo-III-Linguagem-SQL-Versao-Final.pdf364722271-Modulo-III-Linguagem-SQL-Versao-Final.pdf
364722271-Modulo-III-Linguagem-SQL-Versao-Final.pdf
 
Minicurso Epoca mongoDB
Minicurso Epoca mongoDBMinicurso Epoca mongoDB
Minicurso Epoca mongoDB
 
Bancos de dados NoSQL
Bancos de dados NoSQLBancos de dados NoSQL
Bancos de dados NoSQL
 
Escalando+na+aws+para+os+primeiros+10+milhões+de+usuários+ +final
Escalando+na+aws+para+os+primeiros+10+milhões+de+usuários+ +finalEscalando+na+aws+para+os+primeiros+10+milhões+de+usuários+ +final
Escalando+na+aws+para+os+primeiros+10+milhões+de+usuários+ +final
 
Seu banco de dados na nuvem: Opções de bancos de dados na AWS e padrões de...
Seu banco de dados na nuvem: Opções de bancos de dados na AWS e padrões de...Seu banco de dados na nuvem: Opções de bancos de dados na AWS e padrões de...
Seu banco de dados na nuvem: Opções de bancos de dados na AWS e padrões de...
 
Processos iniciais do mapeamento OR
Processos iniciais do mapeamento ORProcessos iniciais do mapeamento OR
Processos iniciais do mapeamento OR
 
ORM e EF
ORM e EFORM e EF
ORM e EF
 
Sql
SqlSql
Sql
 
Construindo um Data Lake na AWS
Construindo um Data Lake na AWSConstruindo um Data Lake na AWS
Construindo um Data Lake na AWS
 
AWS Meetup Rio - Qual banco usar e quando?
AWS Meetup Rio - Qual banco usar e quando?AWS Meetup Rio - Qual banco usar e quando?
AWS Meetup Rio - Qual banco usar e quando?
 
Ruby on Rails for beginners 2.0
Ruby on Rails for beginners 2.0Ruby on Rails for beginners 2.0
Ruby on Rails for beginners 2.0
 
ODI Tutorial - Configuração Topologia
ODI Tutorial - Configuração TopologiaODI Tutorial - Configuração Topologia
ODI Tutorial - Configuração Topologia
 
Expremendo performance do sql server
Expremendo performance do sql serverExpremendo performance do sql server
Expremendo performance do sql server
 
Aplicando uma Estratégia de Banco de Dados AWS Personalizada: Encontre o Banc...
Aplicando uma Estratégia de Banco de Dados AWS Personalizada: Encontre o Banc...Aplicando uma Estratégia de Banco de Dados AWS Personalizada: Encontre o Banc...
Aplicando uma Estratégia de Banco de Dados AWS Personalizada: Encontre o Banc...
 
Construindo um Data Warehouse moderno com Amazon Redshift
Construindo um Data Warehouse moderno com Amazon RedshiftConstruindo um Data Warehouse moderno com Amazon Redshift
Construindo um Data Warehouse moderno com Amazon Redshift
 

Mais de Adilmar Dantas

Mais de Adilmar Dantas (20)

APLICATIVO MÓVEL PARA AFERIÇÃO DA FREQUÊNCIA CARDÍACA E ACOMPANHAMENTO MÉDICO...
APLICATIVO MÓVEL PARA AFERIÇÃO DA FREQUÊNCIA CARDÍACA E ACOMPANHAMENTO MÉDICO...APLICATIVO MÓVEL PARA AFERIÇÃO DA FREQUÊNCIA CARDÍACA E ACOMPANHAMENTO MÉDICO...
APLICATIVO MÓVEL PARA AFERIÇÃO DA FREQUÊNCIA CARDÍACA E ACOMPANHAMENTO MÉDICO...
 
Programação Android Phonegap 1
Programação Android Phonegap 1Programação Android Phonegap 1
Programação Android Phonegap 1
 
Potenciação Divide and Conquer
Potenciação Divide and ConquerPotenciação Divide and Conquer
Potenciação Divide and Conquer
 
Cinta de expansão torácica utilizando Arduino aplicado na fisioterapia respir...
Cinta de expansão torácica utilizando Arduino aplicado na fisioterapia respir...Cinta de expansão torácica utilizando Arduino aplicado na fisioterapia respir...
Cinta de expansão torácica utilizando Arduino aplicado na fisioterapia respir...
 
Análise de Técnicas Computacionais para Classificação de Emoções
Análise de Técnicas Computacionais para Classificação de EmoçõesAnálise de Técnicas Computacionais para Classificação de Emoções
Análise de Técnicas Computacionais para Classificação de Emoções
 
Reconhecimento Automático de Emoções
Reconhecimento Automático de EmoçõesReconhecimento Automático de Emoções
Reconhecimento Automático de Emoções
 
Reconhecimento automático de emoções
Reconhecimento automático de emoçõesReconhecimento automático de emoções
Reconhecimento automático de emoções
 
Detecção de Faces - Redes Neurais *MLP
Detecção de Faces - Redes Neurais *MLPDetecção de Faces - Redes Neurais *MLP
Detecção de Faces - Redes Neurais *MLP
 
Rede Neural MLP para reconhecimento de Faces
Rede Neural MLP para reconhecimento de FacesRede Neural MLP para reconhecimento de Faces
Rede Neural MLP para reconhecimento de Faces
 
ALgoritmo Genético - Escalonamento
ALgoritmo Genético - EscalonamentoALgoritmo Genético - Escalonamento
ALgoritmo Genético - Escalonamento
 
BIODATA: SOFTWARE WEB PARA GERENCIAMENTO DE COLETA DE DADOS BIOMÉDICOS
BIODATA: SOFTWARE WEB PARA GERENCIAMENTO DE COLETA DE DADOS BIOMÉDICOSBIODATA: SOFTWARE WEB PARA GERENCIAMENTO DE COLETA DE DADOS BIOMÉDICOS
BIODATA: SOFTWARE WEB PARA GERENCIAMENTO DE COLETA DE DADOS BIOMÉDICOS
 
Alinhamento de Sequencia DNA
Alinhamento de Sequencia DNAAlinhamento de Sequencia DNA
Alinhamento de Sequencia DNA
 
3ª maratona de games – facom ufu
3ª maratona de games – facom  ufu3ª maratona de games – facom  ufu
3ª maratona de games – facom ufu
 
Monitor Cardíaco usando Arduino
Monitor Cardíaco usando Arduino Monitor Cardíaco usando Arduino
Monitor Cardíaco usando Arduino
 
Algoritmo clique maximo - Analise de Algoritmos
Algoritmo clique maximo  - Analise de AlgoritmosAlgoritmo clique maximo  - Analise de Algoritmos
Algoritmo clique maximo - Analise de Algoritmos
 
Servidores Web
Servidores WebServidores Web
Servidores Web
 
TCC: WebLab Laboratório de Experimentação Remota
TCC: WebLab Laboratório de Experimentação RemotaTCC: WebLab Laboratório de Experimentação Remota
TCC: WebLab Laboratório de Experimentação Remota
 
Weblab TCC
Weblab TCCWeblab TCC
Weblab TCC
 
Engenharia de software testes
Engenharia de software  testesEngenharia de software  testes
Engenharia de software testes
 
Qualidade de Software Web
Qualidade de Software WebQualidade de Software Web
Qualidade de Software Web
 

Querying nosql stores

  • 1. Querying NOSQL stores Autores: Adilmar Dantas Luciana Brito FACULDADE DE COMPUTAÇÃO Universidade Federal de Uberlândia
  • 2. 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.
  • 3. Similaridades entre as características de QUERY’s SQL e mongoDB. • Como alguns desenvolvedores gostariam da presenta de alguns elementos do SQL no noSQL, foi criado então linguagens de consulta com sintaxe e estilo que se assemelham ao SQL.
  • 4. Similaridades entre as características de QUERY’s SQL E mongoDB. • Embora o MongoDB seja um banco de dados de documentos e tenha pouca semelhança com um banco de dados relacional, o idioma de consulta do MongoDB se parece muito com o SQL.
  • 5. Querying NOSQL stores • Para exemplificar vamos carregar a base MOVIELENS, um banco de dados 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
  • 6. Querying NOSQL stores Este arquivo contém os dados sobre os filmes e possui 3952 registros, e cada linha neste arquivo contém um registro, salvo da seguinte maneira. Movies.dat <MovieID>::<Title>::<Genres>
  • 7. Querying NOSQL stores Movieid -> Sequência inteira de números. Title -> Uma String que inclui o ano em que o filme foi lançado entra parênteses anexado ao seu nome. Os títulos são os mesmos do IMDB. *Cada filme pode ser classificado em vários gêneros, que são especificados por um delimitador. Movies.dat Toy Story (1995)::Animation|Children’s|Comedy
  • 8. Querying NOSQL stores Contém as classificações dos 3.952 filmes por mais de 6.000 usuários. O arquivo de classificação possui mais de 1 milhão de registros. Cada linha é um registro diferente que contém dados no seguinte formato: Ratings.dat UserID::MovieID::Rating::Timestamp
  • 9. Querying NOSQL stores • UserID e MovieID identificam e estabelecem um relacionamento com o usuário e o filme, respectivamente. A classificação é uma medida em uma escala de 5 pontos (5 estrelas). • Timestamp captura o tempo em que as classificações foram gravadas. Ratings.dat
  • 10. Querying NOSQL stores • O arquivo users.dat contém dados sobre os usuários que avaliaram os filmes. Ele possui mais de 6.000 usuários e é gravada no seguinte formato: User.dat UserID::Gender::Age::Occupation::Zip-code
  • 11. 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 driver mongoDB 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.
  • 12. Loading the MovieLens Data • Para começar a consultar as coleções MongoDB, inicie o servidor MongoDB e conecte-se a ele usando o shell Mongo. • Os programas necessários são acessíveis a partir da pasta bin da sua instalação do MongoDB. • No seu shell de JavaScript do Mongo, primeiro obtenha uma contagem de todos os valores da coleção de classificações da seguinte maneira: db.ratings.count();
  • 13. Loading the MovieLens Data • Como resposta você terá algo como 1000209, mais de um milhão de classificações indicam que foram carregadas corretamente. • Para obter o conjunto de amostra de dados de classificação, utilize o seguinte comando. db.ratings.find();
  • 14. 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ão parece ser uma boa solução, para contornar esse problema responderemos as seguintes perguntas.
  • 15. Loading the MovieLens Data • Como obter todos os dados de classificação para um determinado filme? • Como obter as informações do filme para uma classificação determinada? • Como juntar uma lista de todos os filmes com os dados de classificação agrupados pelos filmes com os quais eles se relacionam?
  • 16. Loading the MovieLens Data • Em bancos de dados relacionais, esses tipos de relações são realizadas usando junções. No MongoDB, esses dados relacionais são explicitamente correlacionados fora do escopo do servidor. • O MongoDB define o conceito de um DBRef para estabelecer uma relação entre dois campos de duas coleções separadas, mas esse recurso possui algumas limitações e não fornece o mesmo poder que o link explícito baseado em id.
  • 17. Loading the MovieLens Data • Para obter todos os dados de classificação para um determinado filme, você filtra o conjunto de dados usando o ID do filme como critério. • Por exemplo, para ver todas as classificações para o famoso filme Titanic premiado com o Oscar, você precisa primeiro encontrar seu id e depois usar isso para filtrar a coleção de classificações.
  • 18. 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 pode tentar uma combinação aproximada e não exata com as os título na coleçã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 whereclause para obter uma lista de todos os candidatos possíveis.
  • 19. Loading the MovieLens Data • No MongoDB, não há nenhuma expressão semelhante, mas existe um recurso mais poderoso disponível, que é a capacidade de definir um padrão usando expressões regulares. • Então, para obter uma lista de todos os registros na coleção de filmes que têm Titanic ou titanic em seu título, você pode consultar assim: db.movies.find({ title: /titanic/i});
  • 20. 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” ] }
  • 21. Loading the MovieLens Data • O campo de título no conjunto de dados MovieLens inclui o ano em que o filme foi lançado. Dentro do campo de título esta também o ano de lançamento está incluído entre parênteses. • Então, se você se lembrou ou sabia que o Titanic foi lançado no ano de 1997, você pode escrever uma expressão de consulta mais ajustada da seguinte maneira: db.movies.find({title: /titanic.*(1997).*/i})
  • 22. 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 a string (1997). Ele também afirma que isso pode ser 0 ou mais caracteres entre titanic e (1997) e depois (1997). • O suporte para expressões regulares é uma característica poderosa e sempre vale a pena ganhar domínio sobre eles.
  • 23. Loading the MovieLens Data • Então, para obter todas as classificações para o filme Titanic, que tem 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();
  • 24. Loading the MovieLens Data • A resposta à contagem é 1546. As avaliações estão em uma escala de 5 pontos. Para obter uma lista e contar apenas as avaliações de 5 estrelas para o filme Titanic, você pode filtrar ainda mais o conjunto de 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();
  • 25. 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, ambos inclusivos), você pode consultar fazendo as seguintes etapas: • As classificações para Titanic incluem todos os casos possíveis entre 1 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} });
  • 26. Loading the MovieLens Data • runCommand é um padrão diferente do que o estilo de consulta que você esta acostumado porque a coleção é filtrada antes que os valores distintos sejam pesquisados. • Valores distintos para todas as avaliações na coleção podem ser listados da maneira que você viu até agora, da seguinte forma: db.ratings.distinct(“rating”);
  • 27. Loading the MovieLens Data • Você já sabe que o filme Titanic possui as 5 classificações distintas possíveis, para velas agrupadas com a quantidade de classificações você pode construir a seguinte Query.
  • 28. Loading the MovieLens Data • Como resposta você terá a avaliação e sua respectiva contagem veja:
  • 29. Loading the MovieLens Data • Use o recurso MapReduce do MongoDB para executar funções de agrupamento em um MongoDB distribuído. Uma versão MapReduce da função de agrupamento é incluída logo após a operação do group. • MapReduce: é um modelo de programação desenhado para processar grandes volumes de dados em paralelo, dividindo o trabalho em um conjunto de tarefas independentes.
  • 30. Loading the MovieLens Data • A operação em group leva um objeto como entrada. Este objeto de operaçã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.
  • 31. Loading the MovieLens Data • Podemos facilmente transformar um caso em que as classificações para cada filme são agrupadas pelos pontos de classificação usando simplesmente a seguinte operação de group: • Em casos reais, porém, isso não funcionaria para um banco com 1 milhão de registros. Você seria surpreendido com a seguinte mensagem de erro.
  • 32. Loading the MovieLens Data O resultado é retornado como um único objeto BSON e, portanto, a coleção sobre a qual a operação do grupo é aplicada não deve ter mais de 10.000 chaves. Essa limitação também pode ser superada com a função MapReduce.
  • 33. MapReduce in MongoDB • Conforme comentado anteriormente o MapReduce é uma estrutura de software patenteada do Google que suporta computação distribuída. • A estrutura MapReduce do Google inspirou muitas outras estruturas de computação distribuídas na comunidade open- source. MongoDB's é um desses. • Os recursos MapReduce do Google e do MongoDB também são inspirados por construções similares no mundo da programação funcional.
  • 34. MapReduce in MongoDB Os recursos MapReduce do MongoDB não são um clone do MapReduce do Google. O MapReduce do Hadoop é uma implementação de fonte aberta de Ideias de computação distribuída do Google e inclui infraestrutura para bancos de dados de colunas (HBase) e computação baseada em MapReduce.
  • 35. MapReduce in MongoDB • O exemplo de agregação mais simples é uma contagem de cada tipo de item em uma coleção. Para usar MapReduce, você precisa definir uma função de map e uma função de redução e, em seguida, executar o map e reduzir as funções de uma coleção. • Uma função de map aplica uma função a cada membro da coleção e emite um par 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 de redução. • A função de redução executa a função de desagregação em todos os pares de chaves / valores e gera um resultado por sua vez.
  • 36. MapReduce in MongoDB • O map funciona para contar o número de entrevistados femininos (F) e maculinos (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 }); ... };
  • 37. MapReduce in MongoDB • A função de redução para contar o número de ocorrências totais dos tipos masculino 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 }; ... };
  • 38. MapReduce in MongoDB • A função de redução leva um par de chave / valor emitido pela função de map. 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 um tipo específico. • A contagem de linha + = v ['count'] também pode ser escrita como count + = v.count por causa da habilidade de JavaScript para acessar os membros do objeto e seus valores como uma estrutura de dados hash.
  • 39. MapReduce in MongoDB Por fim terremos o seguinte resultado.
  • 40. MapReduce in MongoDB • Para verificar a saída contando o números de pessoas para cada um dos gêneros (M) e (F) basta usar o seguinte script. db.users.find({ “gender”:”F” }).count(); db.users.find({ “gender”:”M”}).count();
  • 41. 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.
  • 42. MapReduce in MongoDB • O MapReduce permite que você escreva muitos algoritmos para otimizar suas buscas em banco de dados distribuidos e com grande volumes de dados. • Pense executar essas buscar em um banco relacional simples sem o uso de técnicas o tempo gasto e a quantidade de infraestrutura necessária para otimizar essas consultas.
  • 43. Hbase • Hbase • É um banco de dados distribuído open-source orientado a coluna, modelado a partir do Google BigTable e escrito em Java. • O Hbase tem fácil integração com o Hadoop, sendo assim, pode ser utilizado o MapReduce para distribuir o processamento dos dados, podendo processar facilmente vários terabytes de dados. • Fácil integração com linguagens como (Java, Python, Ruby, ect).
  • 44. 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.