Map Reduce no CouchDB

Table x Document

O CouchDB trabalha com documentos. Os documentos são expressos em JSON. Cada linha de uma tabela num banco relacional corresponderia a um documento.   table vs document Uma maior flexibilidade é possível em relação ao esquema relacional. Um documento pode possuir uma propriedade com um valor enquanto que outro documento “similar” nem a menciona. table vs document - null   Um campo multi-valorado exige duas tabelas no banco relacional mas os documentos flexivelmente acomodam os valores num array. table vs document - join

Views

No CouchDB uma view é usada para implementar queries e relatórios. As views são as principais ferramentas para estruturar e extrair informações do banco de dados. Para construir uma view definimos duas funções em Javascript, uma para mapping e outra para reduce. temporary-view As views criam árvores B quando o CouchDB percorre todos os documentos do banco de dados aplicando as funções da view a cada documento. As funções associadas à view executam uma única e primeira vez para criar a árvore B.

É análogo a criar um índice num banco de dados relacional. Nas próximas vezes em que a view for usada numa query os resultados são obtidos da árvore previamente construída. Soam como uma memoization sofisticada.

Quando um documento é criado, destruido ou alterado no banco de dados as funções da view são aplicadas individualmente ao documento e o resultado inserido na árvore ou, no caso de um documento removido, o resultado é removido da árvore. A árvore mantém uma referência aos documentos usados para criar os seus nós.

Na Map Function a chamada da função emit no seu corpo cria uma entrada na árvore B que representa a view. O primeiro parâmetro de emit é a chave (key) e o segundo o valor (value). As funções de mapping e de reduce em conjunto criam os resultados que são inseridos na árvore. A função de reduce às vezes é omitida. Quando incluida faz uma agregação dos dados.

RESTFul Interface

 

 

client-rest-couchdb-seq

O diagrama acima resume a interface RESTFul do CouchDB. Mais adiante usaremos o comando cURL no terminal como HTTP Client para o CouchDB.

Map Reduce

Vamos implementar no CouchDB, de forma muito simplificada, uma versão do exemplo clássico da técnica map reduce: contar as palavras repetidas em um texto. O texto usado é o seguinte:

CouchDB is a database that completely embraces the web. Store your data with JSON documents. Access your documents and query your indexes with your web browser, via HTTP. Index, combine, and transform your documents with JavaScript. CouchDB works well with modern web and mobile apps. You can even serve web apps directly out of CouchDB. And you can distribute your data, or your apps, efficiently using CouchDB’s incremental replication. CouchDB supports master-master setups with automatic conflict detection.

Colocamos o texto em um arquivo words.json com o seguinte conteúdo:

{"words" : "CouchDB is a database that completely embraces the web. Store your data with JSON documents. Access your documents and query your indexes with your web browser, via HTTP. Index, combine, and transform your documents with JavaScript. CouchDB works well with modern web and mobile apps. You can even serve web apps directly out of CouchDB. And you can distribute your data, or your apps, efficiently using CouchDB’s incremental replication. CouchDB supports master-master setups with automatic conflict detection."}

Criamos o banco de dados wordcount com o curl:

curl -X PUT http://127.0.0.1:5984/wordcount

Alternativamente podemos criar o banco de dados diretamente na interface Futon. Criamos o documento com:

curl -H "Content-Type:application/json" -X POST http://127.0.0.1:5984/wordcount -d @words.json

Alternativamente podemos criar o documentos diretamente na interface Futon colando os dados.

A partir deste ponto usaremos somente a interface Futon para desenvolver uma view. Vamos testar o seguinte código como uma temporary view:

function(doc) {
  var words = doc.words;
  var array = words.split(" ");
  for (var k = 0; k < array.length; k++) {
    var word = array[k];
    emit(word, 1);
  }
}

O script acima gera uma lista key/value para cada palavra: wordcount-map   Vamos incluir a função reduce:


function(keys, values) {
  return sum(values);
}

wordcount-reduce-function   Para ver melhor o que está acontecendo vamos alterar a reduce function para:

function(keys, values) {
  return values;
}

couchdb-reduce-function-2

Fica como exercício para o leitor incluir outro documento com a propriedade “words” e um outro texto como valor no banco de dados e executar a view novamente.

Links relacionados:

Anúncios

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s