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

Difference between revisions of "MAPREDUCE Elite"

From NoSQLZoo
Jump to: navigation, search
Line 58: Line 58:
 
</div>
 
</div>
  
<div class=q data-lang="py3">
+
<div class=q data-lang="py3">Each system has an allegiance. These are mainly one of the three main factions: The Federation, The Empire, or The Alliance.<br/>
<p class="strong></p>
+
The Alliance consists of Independent systems, though Independent systems are not necessarily part of The Alliance. In such a case their allegiance will be "Independent"<br/>
 +
Finally, there are a few systems that are Anarchists, and come under "Anarchy". Non-populated systems without stations do not have an allegiance, and should be ignored.
 +
<div class="hint" title="Dealing with None">
 +
It's not possible to <code>emit</code> on a field that doesn't exist. Use <code>query</code> to remove documents where <b>allegiance</b> is N/A
 +
</div>
 +
<p class="strong>Show the amount of systems following each allegiance.</p>
 
<pre class=def>
 
<pre class=def>
  
Line 75: Line 80:
 
</pre>
 
</pre>
 
<div class="ans">
 
<div class="ans">
from bson.code import Code; temp = db.systems.map_reduce( query={"allegiance":{"$exists": 1}}, map=Code("function(){emit(this.allegiance,this.faction)}"), reduce=Code("""function(key,values){return values.length}"""), out={"inline":1} );pp.pprint( temp['results'] )  
+
temp = db.systems.map_reduce( query={"allegiance": {"$ne":None}}, map=Code("function(){emit(this.allegiance, {count: 1})}"), reduce=Code("""function(key,values){var total = 0;values.forEach(function(value){ total += value.count; //note this line})return {count: total};} """), out={"inline":1} );pp.pprint(temp['results'])
 
</div>
 
</div>
 
</div>
 
</div>

Revision as of 11:37, 24 July 2015

#ENCODING
import io
import sys
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf-16')
#MONGO
from pymongo import MongoClient
client = MongoClient()
client.elite.authenticate('scott','tiger')
db = client['elite']
#PRETTY
import pprint
pp = pprint.PrettyPrinter(indent=4)
#JS
from bson.code import Code

Introducing the elite database **WORK IN PROGRESS

These questions will introduce the "elite" database, which contains data about the video game Elite Dangerous

There are two collections, commodities and systems. Inside systems there is are nested documents called stations
A system has many stations, and a station has many trade listings

Keys used in this database.

    commodities: 
        _id, average_price, category, name
    systems: 
        _id, allegiance, faction, government, name, population, primary_economy, security, state, stations, updated_at, x, y, z

    systems.stations: 
        allegiance, distance_to_star, economies, export_commodities,has_blackmarket, has_commodities, has_rearm, has_repair,
        has_shipyard, has_outfitting, faction, government, listings, max_landing_pad, name, state, type, updated_at

    systems.stations.listings: 
        buy_price, collected_at, demand, commodity, sell_price, supply, update_count
        

Read more about the structure here: Elite Document Structure

Questions

The commodities collection contains the name and average price of each commodity.

There are 99 commodities and 15 categories.

Find the average price of each category, round to the nearest whole number

from bson.code import Code
pp.pprint(
    db.commodities.find_one()
)







from bson.code import Code;temp = db.commodities.map_reduce( map=Code("function(){emit(this.category,this.average_price)}"), reduce=Code("""function(key,values){var total = 0;for (var i = 0; i < values.length; i++){total += values[i];}return Math.round(total/values.length);} """),out={"inline":1} );pp.pprint(temp['results'])

Each system has an allegiance. These are mainly one of the three main factions: The Federation, The Empire, or The Alliance.

The Alliance consists of Independent systems, though Independent systems are not necessarily part of The Alliance. In such a case their allegiance will be "Independent"
Finally, there are a few systems that are Anarchists, and come under "Anarchy". Non-populated systems without stations do not have an allegiance, and should be ignored.

It's not possible to emit on a field that doesn't exist. Use query to remove documents where allegiance is N/A

Show the amount of systems following each allegiance.













temp = db.systems.map_reduce( query={"allegiance": {"$ne":None}}, map=Code("function(){emit(this.allegiance, {count: 1})}"), reduce=Code("""function(key,values){var total = 0;values.forEach(function(value){ total += value.count; //note this line})return {count: total};} """), out={"inline":1} );pp.pprint(temp['results'])