在传统的数据库方式中,我可以进行连接并找到一个访问'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实现相同的效果?
我注意到有很多方法可以做联合,交叉,但我想弄清楚如何在元组中做相对补充或差异。
答案 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的用户。