From 859212604e96818f5ec0b45c01d83bf2934c6697 Mon Sep 17 00:00:00 2001 From: franck cuny Date: Wed, 16 Jun 2010 11:49:34 +0200 Subject: add three map/reduce operations (from the fast track) --- eg/mapred_01.pl | 26 ++++++++++++++++++++++++++ eg/mapred_02.pl | 27 +++++++++++++++++++++++++++ eg/mapred_03.pl | 43 +++++++++++++++++++++++++++++++++++++++++++ 3 files changed, 96 insertions(+) create mode 100644 eg/mapred_01.pl create mode 100644 eg/mapred_02.pl create mode 100644 eg/mapred_03.pl (limited to 'eg') diff --git a/eg/mapred_01.pl b/eg/mapred_01.pl new file mode 100644 index 0000000..76e26b2 --- /dev/null +++ b/eg/mapred_01.pl @@ -0,0 +1,26 @@ +#!/usr/bin/env perl +use strict; +use warnings; +use 5.010; + +use Net::Riak; + +my $riak = Net::Riak->new(); +my $result; + +$result = $riak->add('goog')->map(get_day_where_high_is('600.00'))->run; +say "days where high is over 600:"; +map { say $_ } sort {$a cmp $b } @$result; + +sub get_day_where_high_is { + my $val = shift; +" +function(value, keyData, arg) { + var data = Riak.mapValuesJson(value)[0]; + if(data.High && data.High > $val) + return [value.key]; + else + return []; +} +"; +} diff --git a/eg/mapred_02.pl b/eg/mapred_02.pl new file mode 100644 index 0000000..31ab0eb --- /dev/null +++ b/eg/mapred_02.pl @@ -0,0 +1,27 @@ +#!/usr/bin/env perl +use strict; +use warnings; +use 5.010; + +use YAML; +use Net::Riak; + +my $riak = Net::Riak->new(); +my $result; + +$result = $riak->add('goog')->map(days_where_close_is_lower_than_open())->run; +say "days where close is lower than open"; +map { say $_ } sort {$a cmp $b} @$result; + +sub days_where_close_is_lower_than_open { + " +function(value, keyData, arg) { + var data = Riak.mapValuesJson(value)[0]; + if(data.Close < data.Open) + return [value.key]; + else + return []; +} +"; +} + diff --git a/eg/mapred_03.pl b/eg/mapred_03.pl new file mode 100644 index 0000000..228260b --- /dev/null +++ b/eg/mapred_03.pl @@ -0,0 +1,43 @@ +#!/usr/bin/env perl +use strict; +use warnings; +use 5.010; + +use Net::Riak; + +my $riak = Net::Riak->new(); +my $result; + +$result = + $riak->add('goog')->map(map_max_daily_variance()) + ->reduce(reduce_max_daily_variance())->run; +say "max daily variance"; +map { say $_ . " => ". $result->[0]->{$_} } sort {$a cmp $b} keys %{$result->[0]}; + +sub map_max_daily_variance { + " +function(value, keyData, arg){ + var data = Riak.mapValuesJson(value)[0]; + var month = value.key.split('-').slice(0,2).join('-'); + var obj = {}; + obj[month] = data.High - data.Low; + return [ obj ]; +} +"; +} + +sub reduce_max_daily_variance { + " +function(values, arg){ + return [ values.reduce(function(acc, item){ + for(var month in item){ + if(acc[month]) { acc[month] = (acc[month] < item[month]) ? item[month] : acc[month]; } + else { acc[month] = item[month]; } + } + return acc; + }) + ]; +} +"; +} + -- cgit 1.4.1