这里是 Hadoop 新手。我有一些这样的用户事件日志,userid 和 timestamp 都是随机排序的:
userid timestamp serviceId
aaa 2012-01-01 13:12:23 4
aaa 2012-01-01 12:11:52 3
ccc 2012-01-03 08:13:07 3
bbb 2012-01-02 02:34:12 8
aaa 2012-01-02 01:09:47 4
ccc 2012-01-02 12:15:39 4
我想获得按userid 排序的中间结果,然后是timestamp,如下所示:
aaa 2012-01-01 12:11:52 3
aaa 2012-01-01 13:12:23 4
aaa 2012-01-02 01:09:47 4
bbb 2012-01-02 02:34:12 8
ccc 2012-01-02 12:15:39 4
ccc 2012-01-03 08:13:07 3
所以它可以很容易地被我的 Reducer 解析。
最终目标是计算用户在不同服务(serviceIds)上花费的时间。使用 Python Hadoop 流可以实现吗?如果不是,那么您会建议什么更好的方法?非常感谢!!
最佳答案
在您的映射器中,您可以发出 userid
作为键,timestamp
和 serviceId
作为按 timestamp
排序的值(为了执行排序操作,我假设每个用户的所有行都可以放入主内存)。
然后 MR 框架将负责将每个用户的所有不同行发送到单个缩减器,您可以在那里轻松地执行分析。
如果每个用户有太多行(比如数百万),您可以发出 userId-serviceId
作为键,并且在 reduce 阶段之后,您将为每个 用户创建一个行文件-service
以及花在该服务上的时间。如果需要,您可以使用 getmerge 加入所有这些文件。
关于algorithm - Python Hadoop 流式处理,二次排序问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24436841/