Raghuveer
Raghuveer

Reputation: 3057

mapreduce javascript function error

I was unable to get the erlang function running so trying with Javascript as below :

curl -XPOST http://localhost:8098/mapred \
  -H "Content-Type: application/json" \
  -d @- \
<<EOF
{
  "inputs":"logs",
  "query":[{
    "map":{
      "language":"javascript",
      "source":"function(riakObject, keydata, arg) {
        var m = riakObject.values[0].data.match(/^INFO.*cart/);
        return [(m ? m.length : 0 )];
      }"
    },
    "reduce":{
      "language":"javascript",
      "source":"function(values, arg){
        return [values.reduce(
          function(total, v){ return total + v; }, 0)
        ];
      }"
    }
  }]
}
EOF

seems not working with JS as well. Shell just hangs and does not return at all. Please suggest.

** UPDATE **

Today when i tried i see the following error :

An error occurred parsing the "query" field.
["Unrecognized format of query phase:\n   ",
 [123,
  [34,<<"map">>,34],
  58,
  [123,
   [34,<<"language">>,34],
   58,
   [34,<<"javascript">>,34],
   44,
   [34,<<"source">>,34],
   58,
   [34,
    <<"function(riakObject, keydata, arg) {        var m = riakObject.values[0].data.match(/^INFO.*Milk/);        return [(m ? m.length : 0 )];      }">>,
    34],
   125],
  44,
  [34,<<"reduce">>,34],
  58,
  [123,
   [34,<<"language">>,34],
   58,
   [34,<<"javascript">>,34],
   44,
   [34,<<"source">>,34],
   58,
   [34,
    <<"function(values, arg){        return [values.reduce(          function(total, v){ return total + v; }, 0)        ];      }">>,
    34],
   125],
  125],
 "\n\nValid formats are:\n   {\"map\":{...spec...}}\n   {\"reduce\":{...spec...}}\n   {\"link:{...spec}}\n"]

Upvotes: 0

Views: 189

Answers (1)

Joe
Joe

Reputation: 28336

The query element should be a list of objects, with "map" and "reduce" being in discreet objects. Your JSON has them as properties of the same object.

This worked for me:

curl -XPOST http://localhost:8098/mapred -H "Content-Type: application/json" -d  '{
  "inputs":"logs",
  "query":[
    {"map":{
      "language":"javascript",
      "source":"function(riakObject, keydata, arg) {
        var m = riakObject.values[0].data.match(/^INFO.*cart/);
        return [(m ? m.length : 0 )];
      }"
    }},
    {"reduce":{
      "language":"javascript",
      "source":"function(values, arg){
        return [values.reduce(
          function(total, v){ return total + v; }, 0)
        ];
      }"
    }}
  ]
}'

Upvotes: 1

Related Questions