假设我有一个非常大的日志文件,具有这种格式(基于用户登录的位置)
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次)。或者有更好的方法来实现它吗?
答案 0 :(得分:0)
我建议在地图阶段使用自定义键。您可以参考教程here进行编写和使用自定义键。自定义键应该有两个部分1)userid 2)placeid。所以基本上在映射器阶段你正在这样做。
emit(<userid, place>, 1)
在缩减阶段,您只需要访问密钥并分别发出密钥的两个部分。
答案 1 :(得分:0)
执行map-reduce。
例如,您有10000行数据,但是一次只能处理1000行数据。
然后,处理1000行数据10次。
如果10个处理结果的行总和> 1000:
再次执行上述步骤。
其他:
直接使用设置。