Cookies help us deliver our services. By using our services, you agree to our use of cookies. More information

Difference between revisions of "MapReduce"

From NoSQLZoo
Jump to: navigation, search
Line 17: Line 17:
  
 
The reduce function uses the JavaScript function Array.sum to add the populations.
 
The reduce function uses the JavaScript function Array.sum to add the populations.
<pre class=def>
+
<pre class="def"><nowiki>
 
db.world.mapReduce(
 
db.world.mapReduce(
 
   function(){emit(this.continent, this.population);},  
 
   function(){emit(this.continent, this.population);},  
Line 23: Line 23:
 
   {out:{inline:1}}
 
   {out:{inline:1}}
 
)
 
)
</pre>
+
</nowiki></pre>
 
</div>
 
</div>
  
Line 32: Line 32:
  
 
That was the reduce function will count the number of countries in each continent.
 
That was the reduce function will count the number of countries in each continent.
<pre class=def>
+
<pre class="def"><nowiki>
 
db.world.mapReduce(
 
db.world.mapReduce(
 
   function(){emit(this.continent, 1);},  
 
   function(){emit(this.continent, 1);},  
Line 38: Line 38:
 
   {out:{inline:1}}
 
   {out:{inline:1}}
 
)
 
)
</pre>
+
</nowiki></pre>
 
</div>
 
</div>
  
Line 46: Line 46:
  
 
In the example we are only counting the countries that have a large population
 
In the example we are only counting the countries that have a large population
<pre class=def>
+
<pre class="def"><nowiki>
 
db.world.mapReduce(
 
db.world.mapReduce(
 
   function()
 
   function()
Line 56: Line 56:
 
   {out:{"inline":1}}
 
   {out:{"inline":1}}
 
)
 
)
</pre>
+
</nowiki></pre>
 
</div>
 
</div>
  
Line 64: Line 64:
  
 
Here we emit the continent and the name, in the reduce function we return v.join(',') to see a comma separated list of the values in the list.
 
Here we emit the continent and the name, in the reduce function we return v.join(',') to see a comma separated list of the values in the list.
<pre class=def>
+
<pre class="def"><nowiki>
 
db.world.mapReduce(
 
db.world.mapReduce(
 
   function(){
 
   function(){
Line 73: Line 73:
 
   {out:{"inline":1}}
 
   {out:{"inline":1}}
 
)
 
)
</pre>
+
</nowiki></pre>
 
</div>
 
</div>
  
Line 81: Line 81:
  
 
Here we emit the value 1 as the key and 1 as the value. The reduce function sums those 1s to get a count of the total number of countries.
 
Here we emit the value 1 as the key and 1 as the value. The reduce function sums those 1s to get a count of the total number of countries.
<pre class=def>
+
<pre class="def"><nowiki>
 
db.world.mapReduce(
 
db.world.mapReduce(
 
   function(){
 
   function(){
Line 89: Line 89:
 
   {out:{"inline":1}}
 
   {out:{"inline":1}}
 
)
 
)
</pre>
+
</nowiki></pre>
 
</div>
 
</div>
  
Line 98: Line 98:
 
Here we emit the key '''this.continent''' and the value '''this.name'''.
 
Here we emit the key '''this.continent''' and the value '''this.name'''.
 
The reduce function returns the first element of the collected list.
 
The reduce function returns the first element of the collected list.
<pre class=def>
+
<pre class="def"><nowiki>
 
db.world.mapReduce(
 
db.world.mapReduce(
 
   function(){
 
   function(){
Line 106: Line 106:
 
   {out:{"inline":1}}
 
   {out:{"inline":1}}
 
)
 
)
</pre>
+
</nowiki></pre>
 
</div>
 
</div>

Revision as of 14:34, 15 June 2018

Introducing the MapReduce function

The MapReduce function is an aggregate function that consists of two functions: Map and Reduce.

The map is always performed before the reduce.

The map function examines every document in the collection and emits (key,value) pairs.

The map function takes no input however the current document can be accessed as this

The reduce function has two inputs, for every distinct key emitted by map the reduce function is called with a list of the corresponding values.

Population of each continent

Here the map function emits the continent and the population for each country.

The reduce function uses the JavaScript function Array.sum to add the populations.

db.world.mapReduce(
  function(){emit(this.continent, this.population);}, 
  function(k, v){ return Array.sum(v); },
  {out:{inline:1}}
)


Number of countries in each continent

Instead of sending populations you can send a list one 1s to the reduce function.

That was the reduce function will count the number of countries in each continent.

db.world.mapReduce(
  function(){emit(this.continent, 1);}, 
  function(k, v){ return Array.sum(v); },
  {out:{inline:1}}
)

Count only some countries

The map function may emit only sometimes.

In the example we are only counting the countries that have a large population

db.world.mapReduce(
  function()
  {
    if (this.population>100000000)
      emit(this.continent, 1);
  },
  function(k, v){ return Array.sum(v); },
  {out:{"inline":1}}
)

Examine the reduce function

Examine the reduce function.

Here we emit the continent and the name, in the reduce function we return v.join(',') to see a comma separated list of the values in the list.

db.world.mapReduce(
  function(){
    if (this.population>100000000)
      emit(this.continent, this.name);
  },
  function(k, v){ return v.join(','); },
  {out:{"inline":1}}
)

Reduce to a single value

If you emit the same key every time you will get exactly one result from your query.

Here we emit the value 1 as the key and 1 as the value. The reduce function sums those 1s to get a count of the total number of countries.

db.world.mapReduce(
  function(){
    emit(1,1);
  },
  function(k, v){ return Array.sum(v); },
  {out:{"inline":1}}
)

Emit a name

You can use the list given in the reduce function.

Here we emit the key this.continent and the value this.name. The reduce function returns the first element of the collected list.

db.world.mapReduce(
  function(){
    emit(this.continent,this.name);
  },
  function(k, v){ return v[0]; },
  {out:{"inline":1}}
)