MapReduce复制自连接

MapReduce复制自连接,mapreduce,nosql,Mapreduce,Nosql,在传统的数据库方式中,我可以进行连接并查找访问“pageA”而不是“pageB”的用户列表 我是这样做的: 表架构: 用户操作{ 用户id, 行动, 页 } 样本数据: 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_

在传统的数据库方式中,我可以进行连接并查找访问“pageA”而不是“pageB”的用户列表

我是这样做的:

表架构: 用户操作{ 用户id, 行动, 页 }

样本数据:

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实现同样的效果


我注意到有很多方法可以实现并集、交集,但我正在尝试找出如何在元组中实现相对补码或差分。

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

映射阶段将检查所有文档的
action==“visit”&(page==“pageA”| | page==“pageB”)
。如果这是真的,它将发出一个文档,其中
user\u id
作为键,
page
作为值

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


检查结果集时,使用
page==“pageB”
忽略所有返回值。这些用户至少访问了pageB一次(但不一定也访问了pageA)。那些使用
page==“pageA”
的用户是您正在搜索的用户:那些只访问了pageA但从未访问过pageB的用户。

谢谢Philipp。这是有道理的,但我从未编写过MapReduce任务,所以我想知道map是否可以发出一个以用户id为键、以页面数组为值的文档。在这种情况下,在reduce阶段,每个用户将有一个文档,并且只返回值数组中包含“pageA”但不包含“pageB”的user_id。这也是一种可能性吗?你能告诉我除了MapReduce之外还有哪些选项更适合这个用例吗?@user27704第一条评论:我不明白你为什么要这么做。@user27704第二条评论:不,我不能,除非你告诉我们你使用的是哪个数据库。每个NoSQL数据库都是不同的。