Documente Academic
Documente Profesional
Documente Cultură
Workflow
1. Map function builds a list of key/value pairs
2. Reduce function reduces the list ( to a single Value)
Id: 2
make: Audi
model: A4
year: 2009
price: 16.000
Id: 3
make: VW
model: Golf
year: 2009
price: 15.000
Id: 4
make: VW
model: Golf
year: 2008
price: 9.000
Key
Step 2: Result:
Valu
e
Key
,
Value
5.400 , 1
9.000 , 4
12.000 , 5
15.000 , 3
16.000 , 2
Oliver Kurowski, @okurow
Id: 5
make: VW
model: Polo
year: 2010
price: 12.000
Q uerying M aps
Original Map
Key
,
Value
5.400 , 1
9.000 , 4
12.000 , 5
15.000 , 3
16.000 , 2
key=10.000
Key
Value
endkey=10.000
Key
,
Value
5.400 , 1
All keys
from
10.000 to
< 15.500
Exact
key, so
no result
All keys,
less than
10.000
M ap Function
Has one document as input
Can emit all JSON-Types as key and value:
- Objects: {price:1300,sold:true}
Results are ordered by key ( or revers)
Reduce Function
Has arrays of keys and values as input
Should reduce the result of a map to a single value
Javascript (Other languages possible)
In CouchDB: some simple built-in native erlang functions
(_sum,_count,_stats)
Is automaticaly called after the map-function has finished
Can be ignored with reduce=false
Is needed for grouping
Id: 2
make: Audi
model: A4
year: 2009
price: 16.000
Id: 3
make: VW
model: Golf
year: 2009
price: 15.000
Id: 4
make: VW
model: Golf
year: 2008
price: 9.000
Key
Result:
Valu
e=1
Key
,
Value
Audi , 1
Audi , 1
VW,
1
VW,
1
VW,
1
Id: 5
make: VW
model: Polo
year: 2010
price: 12.000
Key
Value
Audi ,
Audi ,
VW ,
VW ,
VW ,
,
1
1
1
1
1
Result:
Key
,
Value
null
, 5
- key=Audi
Key
,
Value
null , 2
- group=true
Key
,
Value
Audi , 2
VW , 3
- reduce=false
Key
Value
Audi ,
Audi ,
VW ,
VW ,
VW ,
,
1
1
1
1
1
Like
having
no
reducefunction
A rray-K ey M ap/Reduce
A List of cars (again)
Exam ple
Id: 1
make: Audi
model: A3
year: 2000
price: 5.400
Id: 2
make: Audi
model: A4
year: 2009
price: 16.000
Id: 3
make: VW
model: Golf
year: 2009
price: 15.000
Id: 4
make: VW
model: Golf
year: 2008
price: 9.000
Key
, Value
[Audi, A3, 2000]
1
[Audi, A4, 2009]
1
[VW, Golf, 2008]
[VW, Golf, 2009]
[VW, Polo, 2010]
,
,
,1
,1
,1
Id: 5
make: VW
model: Polo
year: 2010
price: 12.000
A rray-K ey M ap/Reduce
startkey=[Audi]
Q uer
ying
( &group=true)
startkey=[VW]
( &group=true)
endkey=[VW]
(&group=true)
Key
, Value
[Audi, A3, 2000] ,
1
[Audi, A4, 2009] ,
1
[VW, Golf, 2008] ,
1
[VW,
Key Golf, 2009] ,
1, Value
[VW, Polo,
2010], ,
[Audi,
A3, 2000]
1
[Audi, A4, 2009] ,
1
[VW, Golf, 2008] ,
1
[VW, Golf, 2009] ,
Key
1
, Value
[VW, Polo, 2010] ,
[Audi, A3, 2000] ,
1
1
[Audi, A4, 2009] ,
1
[VW, Golf, 2008] ,
1
[VW, Golf, 2009] ,
1
[VW, Polo, 2010] ,
1
Remembe
r:Endkey
is not in
resultlist
- startkey=[VW,Golf]
- endkey= [VW,Polo]
- (&group=true)
Key
, Value
[Audi, A3, 2000] ,
1
[Audi, A4, 2009] ,
1
[VW, Golf, 2008]
, 1
[VW, Golf, 2009]
, 1
[VW, Polo, 2010] ,
1
Key
, Value
- startkey=[VW,Golf]
- endkey=[VW,Golf,99999]
- (&group=true)
- better: endkey=[VW,Golf,{}]
(aka group_level=exact)
group_level=1
Key
, Value
[Audi, A3, 2000] ,
1
[Audi, A4, 2009] ,
1
[VW, Golf, 2008] ,
1
[VW, Golf, 2009] ,
1
Key
, Value
[VW,
Polo,
[Audi] , 2 2010] ,
1
[VW] , 3
Key
, Value
[Audi, A3] , 1
[Audi, A4] , 1
[VW, Golf] , 2
[VW, Polo] , 1
Exam ples:
Get all car makes:
- group_level=1
Key
, Value
[Audi] , 2
[VW] , 3
- startkey=[VW]&endkey=[VW,{}]&group_level=2
Key
,
Value
[VW, Golf] , 2
[VW, Polo] , 1
- startkey=[VW,Golf]&endkey=[VW,Golf,
{}]&group_level=3
Key
, Value
[VW, Golf, 2008] ,
1
[VW, Golf, 2009] ,
1
Reduce /Rereduce:
A rule to use reduce-functions:
Value
Audi , 2
VW
, 3
ues) {
return
sum(values);
}
Key ,
Value
null , 5
Why ?
A reduce function can be used more than just once
W TF ?
Oliver Kurowski, @okurow
Reduce /Rereduce:
Example for counting values( Will produce wrong result !)
function(keys,values
){
return
count(values);
}
Key ,
Value
1
, 1
2
, 10
3
, 4
999 , 7
1000 , 12
Key ,
Value
1
,
1
2
,
10
Key
,
333
Value ,
23
334
,
15
335
,
99
Key
,
666
,
Value
82
667
,
18
668
,
149
Split
1000 ,
12
function(keys,values
){
return
count(values);
}
Key ,
Value
null
,
333
function(keys,values
){
return
count(values);
}
Key ,
Value
null
,
333
function(keys,values
){
return
count(values);
}
Key ,
Value
null
,
333
function(keys,value
s) {
return
count(values);
}
Key ,
Value
null
,
3
Boom !
3 != 1000
Reduce /Rereduce:
Solution: The rereduce-Flag (not mentioned yet)
Key ,
Value
1
, 1
2
, 10
3
, 4
999 , 7
1000 , 12
Key ,
Value
1
,
1
2
,
10
Key
,
333
,
Value
23
334
,
15
335
,
99
Key
,
666
Value ,
82
667
,
18
668
,
149
Split
1000 ,
if(rereduce==false
){
return
count(values);
Key ,
Value
null
,
333
if(rereduce==false
){
return
count(values);
Key ,
Value
null
,
333
if(rereduce==false
){
return
count(values);
Key ,
Value
null
,
334
rereduce=false
else{
return
sum(values)
}
Key ,
Value
null
,
1000
Correct
rereduce=true
The function:
Doc._id , Key
,
Value
4
, Audi
,
12.000
2
, BMW
,
20.000
1
, Citroen ,
9.000
function(keys
3
, ,values,
Dacia
,
rereduce)
{
6.500
return sum(values);
- keys:
- values:
- rereduce:
[ [Audi,4],[BMW,2],[Citroen,1],
[Dacia,3] ]
[ 12.000,20.000,9.000,6.
500]
fals
e
- keys:
- values:
- rereduce:
null
[47.50
0]
true
View calling
All documents in the database are called by a view once
After the first call: Only new and changed docs are called by
must be changed
Stale=ok: do not start indexing, just deliver the stored result
Stale=update_after: deliver old results, start indexing after that
Group, group_level,reduce=false: should be known
Youve m ade it !