Difference between revisions of "MAPREDUCE Elite"
m (Tidy, question correction, and placeholders) |
|||
Line 22: | Line 22: | ||
==Questions== | ==Questions== | ||
− | <div class=q data-lang="mongo" data-switches='elite'>The <code>commodities</code> collection contains the <code>name</code> and <code>average_price</code> of each commodity.<br/> | + | <div class="q" data-lang="mongo" data-switches='elite'>The <code>commodities</code> collection contains the <code>name</code> and <code>average_price</code> of each commodity.<br/> |
There are 99 unique commodities and 15 categories. | There are 99 unique commodities and 15 categories. | ||
− | <p class="strong">Find the average price of each category, round to the nearest whole number</p> | + | <p class="strong">Find the average price of each category, round to the nearest whole number.</p> |
− | <pre class=def | + | <pre class="def"> |
− | |||
− | |||
− | |||
db.commodities.mapReduce( | db.commodities.mapReduce( | ||
− | function(){emit( | + | function(){ |
− | function(k,v){return | + | emit(1,1); |
+ | }, | ||
+ | function(k,v){ | ||
+ | return Array.sum(v); | ||
+ | }, | ||
{out:{inline:1}} | {out:{inline:1}} | ||
) | ) | ||
+ | </pre> | ||
+ | <div class="ans">db.commodities.mapReduce(function(){emit(this.category,this.average_price);},function(k,v){return Math.round(Array.sum(v)/v.length);},{out:{inline:1}}) | ||
</div> | </div> | ||
</div> | </div> | ||
− | + | <div class="q" data-lang="mongo" data-switches='elite'>Each system has an <code>allegiance</code>. There are three main factions: <b>The Federation</b>, <b>The Empire</b>, and <b>The Alliance</b>.<br/> | |
− | <div class=q data-lang="mongo" data-switches='elite'>Each system has an <code>allegiance</code>. There are three main factions: <b>The Federation</b>, <b>The Empire</b>, and <b>The Alliance</b>.<br/> | ||
<p>Non-populated systems without stations do not have an allegiance, and should be ignored.</p> | <p>Non-populated systems without stations do not have an allegiance, and should be ignored.</p> | ||
− | <p class=strong>Show the amount of systems following each type of allegiance.</p> | + | <p class="strong">Show the amount of systems following each type of allegiance.</p> |
− | <pre class=def | + | <pre class="def"> |
− | |||
− | |||
db.systems.mapReduce( | db.systems.mapReduce( | ||
function(){ | function(){ | ||
− | + | emit(1,1); | |
− | emit( | + | }, |
− | function(k,v){return Array.sum(v);}, | + | function(k,v){ |
+ | return Array.sum(v); | ||
+ | }, | ||
{out:{inline:1}} | {out:{inline:1}} | ||
− | ) | + | ) |
+ | </pre> | ||
+ | <div class="ans">db.systems.mapReduce(function(){if (this.allegiance!=null){emit(this.allegiance,1);}},function(k,v){return Array.sum(v);},{out:{inline:1}})</div> | ||
</div> | </div> | ||
− | + | <div class="q" data-lang="mongo" data-switches='elite'> | |
− | |||
− | <div class=q data-lang="mongo" data-switches='elite'> | ||
<p class="strong">What are the populations of the three main factions?</p> | <p class="strong">What are the populations of the three main factions?</p> | ||
− | <div class=hint title="Three main factions">["Alliance","Federation","Empire"]</div> | + | <div class="hint" title="Three main factions">["Alliance","Federation","Empire"]</div> |
− | < | + | <div class="hint" title="NaN?">Some systems have no populations, make sure to exclude them using <code>!isNaN()</code>.</div> |
− | </ | + | <pre class="def"> |
− | < | ||
db.systems.mapReduce( | db.systems.mapReduce( | ||
function(){ | function(){ | ||
− | + | emit(1,1); | |
− | emit( | + | }, |
− | function(k,v){return Array.sum(v);}, | + | function(k,v){ |
+ | return Array.sum(v); | ||
+ | }, | ||
{out:{inline:1}} | {out:{inline:1}} | ||
) | ) | ||
− | </div> | + | </pre> |
+ | <div class="ans">db.systems.mapReduce(function(){if (!isNaN(this.population) && this.allegiance!=null && this.allegiance!="Independent" && this.allegiance!="Anarchy"){emit(this.allegiance, this.population);}},function(k,v){return Array.sum(v);},{out:{inline:1}})</div> | ||
</div> | </div> | ||
Revision as of 17:45, 21 March 2018
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 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 unique commodities and 15 categories.
Find the average price of each category, round to the nearest whole number.
db.commodities.mapReduce( function(){ emit(1,1); }, function(k,v){ return Array.sum(v); }, {out:{inline:1}} )
allegiance
. There are three main factions: The Federation, The Empire, and The Alliance.Non-populated systems without stations do not have an allegiance, and should be ignored.
Show the amount of systems following each type of allegiance.
db.systems.mapReduce( function(){ emit(1,1); }, function(k,v){ return Array.sum(v); }, {out:{inline:1}} )
What are the populations of the three main factions?
!isNaN()
.db.systems.mapReduce( function(){ emit(1,1); }, function(k,v){ return Array.sum(v); }, {out:{inline:1}} )
Harder Questions
The amount of stations and the amount of listings aren't fixed, you'll need to query
to ensure that they exist and find a way of iterating through them in your map
stage.
db.systems.mapReduce(
function(){ if (this.stations){ for(var i=0;i<this.stations.length;i++){ var station = this.stations[i]; if (station.listings && station.allegiance){ for(var j=0;j<station.listings.length;j++){ var comm = station.listings[j]; if (comm.commodity==='Hydrogen Fuel') emit(station.allegiance,comm.supply); } }else{ //emit('no listing',1); } } }else{ //emit('no stations',1); } }, function(k,v){return Array.sum(v);}, {out:{inline:1},limit:5000});
power_control_faction
or Power is an individual or organisation who is in control of a system.These powers have allegiances, but the systems they control do not nescessarily have the same allegiance as they do.
{ '_id': 'Zemina Torval', 'value': { 'alliance': 0.0, 'anarchy': 0.0, 'empire': 39.0, 'federation': 3.0, 'independent': 5.0}}]
Show the allegiance of each of the power's systems
temp = db.systems.map_reduce(query={"power_control_faction":{"$exists":1}},map=Code("""function(){switch(this.allegiance){case "Alliance":emit(this.power_control_faction,{alliance:1,anarchy:0,empire:0,federation:0,independent:0});break;case "Anarchy":emit(this.power_control_faction,{alliance:0,anarchy:1,empire:0,federation:0,independent:0});break; case "Empire":emit(this.power_control_faction,{alliance:0,anarchy:0,empire:1,federation:0,independent:0});break;case "Federation":emit(this.power_control_faction,{alliance:0,anarchy:0,empire:0,federation:1,independent:0});break;case "Independent":emit(this.power_control_faction,{alliance:0,anarchy:0,empire:0,federation:0,independent:1});break;}}"""),reduce=Code("""function(k,vs){var a=vs[0];for(var i=1;i<vs.length;i++){var b=vs[i];a.alliance+=b.alliance;a.anarchy+=b.anarchy;a.empire+=b.empire;a.federation+=b.federation;a.independent+=b.independent;}return a}"""),out={"inline":1}); pp.pprint(temp['results']);
Using the result from the previous question, guess the power's allegiance by the faction that the majority of their systems follow.
Zemina Torval: Empire(39.0)
temp = db.systems.map_reduce(query={"power_control_faction":{"$exists":1}},map=Code("""function(){switch(this.allegiance){case "Alliance":emit(this.power_control_faction,{alliance:1,anarchy:0,empire:0,federation:0,independent:0});break;case "Anarchy":emit(this.power_control_faction,{alliance:0,anarchy:1,empire:0,federation:0,independent:0});break; case "Empire":emit(this.power_control_faction,{alliance:0,anarchy:0,empire:1,federation:0,independent:0});break;case "Federation":emit(this.power_control_faction,{alliance:0,anarchy:0,empire:0,federation:1,independent:0});break;case "Independent":emit(this.power_control_faction,{alliance:0,anarchy:0,empire:0,federation:0,independent:1});break;}}"""),reduce=Code("""function(k,vs){var a=vs[0];for(var i=1;i<vs.length;i++){var b=vs[i];a.alliance+=b.alliance;a.anarchy+=b.anarchy;a.empire+=b.empire;a.federation+=b.federation;a.independent+=b.independent;}return a}"""),out={"inline":1}); for power in temp['results']:
max = 0; key = ""; #print(power['value']) for id in power['value']: if (power['value'][id] > max): max = power['value'][id] key = id print(power['_id']+": "+key+"("+str(max)+")")