>假设我有一个非常大的日志文件,这种格式(基于用户登录的位置)
UserId1 , New York
UserId1 , New Jersey
UserId2 , Oklahoma
UserId3 , Washington DC
....
userId999999999, London
请注意,UserId1 首先在纽约登录,然后飞往新泽西并从那里再次登录。
如果我需要获取多少个唯一用户登录(意味着 2 次登录将相同的用户 ID 视为 1 次登录),我应该如何映射和减少它?
我最初的计划是我想先将其映射到这种格式:
UserId1, 1
UserId1, 1
UserId2, 1
UserId3, 1
然后将其减少到
UserId1, 2
UserId2, 1
UserId3, 1
但这会导致输出仍然很大(特别是如果用户的常见行为是每天登录 1 或 2 次)。或者有更好的方法来实现这一点?
do map-reduce。
例如,您有 10000 行数据,但一次只能处理 1000 行数据。
然后,处理 1000 行数据 10 次。
如果 10 处理结果的行数总和> 1000:
再次执行上述步骤。
还:
直接使用设置。
我建议在映射阶段使用自定义键。您可以参考此处的教程来编写和使用自定义密钥。自定义密钥应包含两部分 1) 用户 ID 2) 放置 ID。所以基本上在映射器阶段,你正在这样做。
emit(<userid, place>, 1)
在reduce阶段,您只需访问密钥并分别发出密钥的两个部分。