面试题答案
一键面试Map函数
function(doc) {
if (doc.region && doc.stores) {
doc.stores.forEach(function(store) {
store.sales.forEach(function(sale) {
emit([doc.region, sale.date], sale.amount);
});
});
}
}
Reduce函数
function(keys, values, rereduce) {
if (rereduce) {
return sum(values);
} else {
return sum(values);
}
}
function sum(values) {
return values.reduce(function(acc, value) {
return acc + value;
}, 0);
}
性能优化 - 处理分区和合并结果
- 分区: CouchDB会自动根据文档ID对数据进行分区。在Map阶段,通过emit([doc.region, sale.date], sale.amount),我们按区域和日期组合键进行emit,这样相同区域和日期的数据会被分配到相同的Reduce任务中,便于后续计算。
- 合并结果: 在Reduce函数中,当rereduce为true时,表示正在进行二次Reduce(即合并中间Reduce结果)。在这种情况下,我们只需对传入的values数组求和,就像普通Reduce一样。CouchDB会自动处理中间结果的合并,将每个分区的Reduce结果再次进行Reduce操作,最终得到全局的结果。这样在分布式环境下可以高效地处理大规模数据并计算出每个区域所有商店每天的总销售额。