MapReduce复制自联接

时间:2014-04-30 20:51:48

标签: mapreduce nosql

在传统的数据库方式中,我可以进行连接并找到一个访问'pageA'但不访问'pageB'的用户列表。

继承人我在做什么:

表格架构: t_user_actions {   用户身份,   行动,   页 }

示例数据:

user_id, action, page
111, visit, pageX
222, visit, pageA
222, visit, pageB
333, visit, pageA

我可以编写此SQL来查找访问pageA但不访问pageB的所有用户的列表:

SELECT distinct u1.user_id user_id
FROM t_user_actions u1 left join t_user_actions u2 USING (user_id)
WHERE u1.page="pageA" and u2.page="pageB" and
u2.user_id is NULL

如果我正在处理大型数据集,假设我可以将原始数据导入/插入某个NOSQL数据库,我如何使用MapReduce实现相同的效果?

我注意到有很多方法可以做联合,交叉,但我想弄清楚如何在元组中做相对补充或差异。

1 个答案:

答案 0 :(得分:0)

根据您实际使用的数据库,可能有比MapReduce更好的方法。但是你特意要求MapReduce,所以......

Map阶段将检查action == "visit" && (page == "pageA" || page == "pageB")的所有文档。如果是这样,它将发出一个文档,其中user_id为关键字,page为值。

Reduce阶段将迭代每个用户收到的所有值。如果“pageB”中至少有一个值,则返回“pageB”,否则返回“pageA”。

检查结果集时,忽略page == "pageB"的所有返回值。那些用户至少访问过一次pageB(但也不一定是pageA)。那些page == "pageA"的人是您要搜索的人:仅访问过pageA但从未访问过pageB的用户。