Difference between revisions of "MAPREDUCE Elite"
(Update Q5) |
(Add Q6 js and minify Q5.) |
||
Line 20: | Line 20: | ||
Read more about the structure here: [[Elite Document Structure]] | Read more about the structure here: [[Elite Document Structure]] | ||
<br/><br/> | <br/><br/> | ||
− | |||
==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/> | ||
Line 109: | Line 108: | ||
function(k,v){return Array.sum(v);}, | function(k,v){return Array.sum(v);}, | ||
{out:{inline:1},limit:5000} | {out:{inline:1},limit:5000} | ||
− | );</pre> | + | ); |
+ | </pre> | ||
</div> | </div> | ||
− | |||
<div class="q" data-lang="mongo" data-switches='elite'>A <code>power_control_faction</code> or <b>Power</b> is an individual or organisation who is in control of a system.<br/> | <div class="q" data-lang="mongo" data-switches='elite'>A <code>power_control_faction</code> or <b>Power</b> is an individual or organisation who is in control of a system.<br/> | ||
These powers have allegiances, but the systems they control do not nescessarily have the same allegiance as they do. | These powers have allegiances, but the systems they control do not nescessarily have the same allegiance as they do. | ||
Line 137: | Line 136: | ||
</pre> | </pre> | ||
<pre class="ans"> | <pre class="ans"> | ||
− | db.systems.mapReduce( | + | db.systems.mapReduce(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;}},function(k,v){let a=v[0];for(let i=1;i<v.length;i++){let b=v[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},query:{"power_control_faction":{"$exists":1}}}) |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | ) | ||
</pre> | </pre> | ||
</div> | </div> | ||
− | |||
<div class="q" data-lang="mongo" data-switches='elite'>Our dataset doesn't contain the allegiance of a power: | <div class="q" data-lang="mongo" data-switches='elite'>Our dataset doesn't contain the allegiance of a power: | ||
<p class="strong">Using the result from the previous question, guess the power's allegiance by the faction that the majority of their systems follow.</p> | <p class="strong">Using the result from the previous question, guess the power's allegiance by the faction that the majority of their systems follow.</p> | ||
Line 192: | Line 154: | ||
</pre> | </pre> | ||
<pre class="ans"> | <pre class="ans"> | ||
− | + | db.systems.mapReduce(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;}},function(k,v){let a=v[0]; for(let i=1;i<v.length;i++){let b=v[i];a.Alliance+=b.Alliance;a.Anarchy+=b.Anarchy;a.Empire+=b.Empire;a.Federation+=b.Federation;a.Independent+=b.Independent;}return a;},{finalize:function(k,v){return Object.keys(v).reduce((a,b)=>v[a]>v[b]?a:b);},out:{"inline":1},query:{"power_control_faction":{"$exists":1}}}) | |
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
</pre> | </pre> | ||
</div> | </div> | ||
− | |||
− |
Revision as of 23:32, 22 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}} )
db.commodities.mapReduce(function(){emit(this.category,this.average_price);},function(k,v){return Math.round(Array.sum(v)/v.length);},{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}} )
db.systems.mapReduce(function(){if (this.allegiance!=null){emit(this.allegiance,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}} )
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}})
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.commodities.mapReduce( function(){ emit(1,1); }, function(k,v){ return Array.sum(v); }, {out:{inline:1}} )
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
db.commodities.mapReduce( function(){ emit(1,1); }, function(k,v){ return Array.sum(v); }, {out:{inline:1}} )
db.systems.mapReduce(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;}},function(k,v){let a=v[0];for(let i=1;i<v.length;i++){let b=v[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},query:{"power_control_faction":{"$exists":1}}})
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)
db.commodities.mapReduce( function(){ emit(1,1); }, function(k,v){ return Array.sum(v); }, {out:{inline:1}} )
db.systems.mapReduce(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;}},function(k,v){let a=v[0]; for(let i=1;i<v.length;i++){let b=v[i];a.Alliance+=b.Alliance;a.Anarchy+=b.Anarchy;a.Empire+=b.Empire;a.Federation+=b.Federation;a.Independent+=b.Independent;}return a;},{finalize:function(k,v){return Object.keys(v).reduce((a,b)=>v[a]>v[b]?a:b);},out:{"inline":1},query:{"power_control_faction":{"$exists":1}}})