MAPREDUCE Elite: Difference between revisions
From NoSQLZoo
m Tidy, question correction, and placeholders |
Replace ans divs with pre as something (mediawiki, browser?) is auto inserting <p> tags and breaking things |
||
| Line 36: | Line 36: | ||
) | ) | ||
</pre> | </pre> | ||
< | <pre 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> | ||
| Line 53: | Line 53: | ||
) | ) | ||
</pre> | </pre> | ||
< | <pre 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'> | ||
| Line 70: | Line 70: | ||
) | ) | ||
</pre> | </pre> | ||
< | <pre 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> | ||
| Line 80: | Line 80: | ||
<pre class=def> | <pre class=def> | ||
</pre> | </pre> | ||
< | <pre class="ans"> | ||
db.systems.mapReduce( | db.systems.mapReduce( | ||
function(){ | function(){ | ||
| Line 120: | Line 120: | ||
<pre class=def> | <pre class=def> | ||
</pre> | </pre> | ||
< | <pre class="ans"> | ||
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}); | 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']); | pp.pprint(temp['results']); | ||
| Line 131: | Line 131: | ||
<pre class=def> | <pre class=def> | ||
</pre> | </pre> | ||
< | <pre class="ans"> | ||
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}); | 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']: | for power in temp['results']: | ||
Revision as of 17:53, 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
The
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}})
</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/>
<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>
<pre class="def">
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}})</div>
</div>
<div class="q" data-lang="mongo" data-switches='elite'>
<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="NaN?">Some systems have no populations, make sure to exclude them using <code>!isNaN()</code>.</div>
<pre class="def">
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}})</div>
</div>
==Harder Questions==
<div class=q data-lang="mongo" data-switches='elite'>How much Hydrogen Fuel is owned by stations in systems. Limit your query to the first 5000 stations.
<div class="hint" title="hint">
The amount of stations <b>and</b> the amount of listings aren't fixed, you'll need to <code>query</code> to ensure that they exist and find a way of iterating through them in your <code>map</code> stage.
</div>
<pre class=def>
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}
);</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/>
These powers have allegiances, but the systems they control do not nescessarily have the same allegiance as they do.
<div class="hint" title="Example"> At the time of writing <b>Zemina Torval</b> is allied with the <b>Empire</b> and controls <b>47</b> systems.<br/>
<pre>
{ '_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']);
</div>
</div>
<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>
<div class="hint" title="Example"><code>Zemina Torval: Empire(39.0)</code></div>
<pre class=def>
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)+")")