MAPREDUCE Elite: Difference between revisions
From NoSQLZoo
No edit summary |
No edit summary |
||
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"> | ||
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 10: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
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'])
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'])