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
(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}}})
    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,vs){
 
        let a = vs[0];
 
        for(let i=1; i < vs.length; i++){
 
            let 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},
 
        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">
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});
+
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}}})
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)+")")
 
 
</pre>
 
</pre>
 
</div>
 
</div>
 
<!--Special thanks to Harry T (40297170) & Callum M (40297158) For the answers-->
 

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

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}})
Each system has an 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?

["Alliance","Federation","Empire"]
Some systems have no populations, make sure to exclude them using !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

How much Hydrogen Fuel is owned by stations in systems. Limit your query to the first 5000 stations.

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}
);
A 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.

At the time of writing Zemina Torval is allied with the Empire and controls 47 systems.
    {   '_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}}})
Our dataset doesn't contain the allegiance of a power:

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}}})