1

假设我有一个非常大的具有这种格式的日志文件(基于用户登录的位置)

UserId1 , New York
UserId1 , New Jersey
UserId2 , Oklahoma
UserId3 , Washington DC
....
userId999999999, London

请注意,UserId1 首先登录纽约,然后他飞往新泽西并从那里再次登录。

如果我需要获取多少个唯一用户登录(意味着 2 次登录将与 1 次登录相同的用户 ID),我应该如何映射和减少它?

我最初的计划是我想先把它映射成这种格式:

UserId1, 1
UserId1, 1
UserId2, 1
UserId3, 1

然后将其减少到

UserId1, 2
UserId2, 1
UserId3, 1

但这会导致输出数量仍然很大(特别是如果用户的常见行为是每天登录 1 或 2 次)。还是有更好的方法来实现这一点?

4

2 回答 2

0

我建议在映射阶段使用自定义键。你可以参考这里的教程来编写和使用自定义键。自定义键应该有两部分 1) userid 2)placeid。所以基本上在映射器阶段你正在这样做。

emit(<userid, place>, 1)

在 reduce 阶段,您只需要访问密钥并分别发出密钥的两个部分。

于 2013-01-15T09:02:31.943 回答
0

做map-reduce。

例如,您有 10000 行数据,但一次只能处理 1000 行数据。

然后,处理 1000 行数据 10 次。

如果 10 次处理结果的总行数 > 1000:

再次执行上述步骤。

别的:

直接使用set。

于 2018-11-04T23:26:56.863 回答