分享

面试题:要求编写MapReduce程序算出高峰时间段哪张表被访问的最频繁

hyj 发表于 2014-5-31 18:29:27 [显示全部楼层] 回帖奖励 阅读模式 关闭右栏 14 27950
最近去面试,出了个这样的题目,大家有兴趣也试试。
用Hadoop分析海量日志文件,每行日志记录了如下数据:
TableName(表名),Time(时间),User(用户),TimeSpan(时间开销)

要求编写MapReduce程序算出高峰时间段(如上午10点)哪张表被访问的最频繁,以及这段时间访问这张表最多的用户,以及这个用户的总时间开销。



已有(14)人评论

跳转到指定楼层
nettman 发表于 2014-5-31 18:37:34
本帖最后由 nettman 于 2014-5-31 18:40 编辑
分析:
首先这个表还是比较简单的。如果你会写wordcount,这个应该不困难。
首先
(1)按照表名来分区
(2)最后计算这个表的个数就ok了。
跟单词计数差不多。表即为单词,表的记录数即为单词的个数。



回复

使用道具 举报

hadoop小象 发表于 2014-5-31 18:45:03
要是有数据我就写一个
回复

使用道具 举报

hyj 发表于 2014-5-31 19:06:00
hadoop小象 发表于 2014-5-31 18:45
要是有数据我就写一个
TableName(表名),Time(时间),User(用户),TimeSpan(时间开销小时)
user1                         1:00         u1         1.5
user2                         2:00         u2         0.5
user3                         3:00         u3         0.1
user4                         4:00         u1         1.4
user5                         5:00         u4         1.3
user6                         6:00         u4         1.9
user7                         7:00         u5         2.4
user8                          8:00         u1         0.1
user9                         9:00         u6         0.6
user10                      10:00        u1         0.5
user11                       1:00         u2         0.2
user12                       3:00         u4         0.9
user13                       4:00         u2         9.1
user14                       6:00         u1         6.1
user15                        5:00         u5         5.1

回复

使用道具 举报

hadoop小象 发表于 2014-6-1 16:37:57
hyj 发表于 2014-5-31 19:06
TableName(表名),Time(时间),User(用户),TimeSpan(时间开销小时)
user1                         1:00 ...

正在写,遇到一问题卡住了,唉,看看这什么情况
今天自己写mapreduce时,在reduce中遇到一个很纠结的问题,上其中部分代码:        List<MyObj> list=new ArrayList<MyObj>();
        for(MyObj mm:v2){
                                count++;
                                System.out.println("放入list之前time值      "+mm.getTime());
                                list.add(mm);
                               
                        }
        for(MyObj obj:list){
                obj.setCount(new Text(String.valueOf(count)));
                System.out.println("放入list之后time值   "+obj.getTime());
                               
        }
结果是:

放入list之前time值      1.4
放入list之前time值      0.6
放入list之前time值      9.2
放入list之前time值      2.1
放入list之前time值      0.7
放入list之后time值   0.7
放入list之后time值   0.7
放入list之后time值   0.7
放入list之后time值   0.7
放入list之后time值   0.7



结果怎么会这样呢?

回复

使用道具 举报

hyj 发表于 2014-6-1 18:26:00
hadoop小象 发表于 2014-6-1 16:37
正在写,遇到一问题卡住了,唉,看看这什么情况
今天自己写mapreduce时,在reduce中遇到一个很纠结的问 ...

你循环四个估计打印出来的应该是全部2.1

放入list之前time值      1.4
放入list之前time值      0.6
放入list之前time值      9.2
放入list之前time值      2.1

放入list之后time值   2.1
放入list之后time值   2.1
放入list之后time值   2.1
放入list之后time值   2.1


回复

使用道具 举报

hadoop小象 发表于 2014-6-1 21:33:47
hyj 发表于 2014-6-1 18:26
你循环四个估计打印出来的应该是全部2.1

放入list之前time值      1.4

原因呢,我只是在reduce中将value的值放入到list中,怎么结果会那样呢?
回复

使用道具 举报

hyj 发表于 2014-6-1 22:28:27
hadoop小象 发表于 2014-6-1 21:33
原因呢,我只是在reduce中将value的值放入到list中,怎么结果会那样呢?

你贴出你的全部代码来,你重复的给赋值了
回复

使用道具 举报

hadoop小象 发表于 2014-6-2 08:49:56
hyj 发表于 2014-6-1 22:28
你贴出你的全部代码来,你重复的给赋值了

static class MyReducer extends Reducer<Text, MyObj, Text, Text>{
                        @Override
                protected void reduce(Text key, Iterable<MyObj> v2,Context con)
                                throws IOException, InterruptedException {
                        System.out.println("这是一个reduce  ");
                        long count=0L;
                        List<MyObj> list=new ArrayList<MyObj>();
                        for(MyObj mm:v2){
                                count++;
                                System.out.println("放入list之前time值      "+mm.getUser()+" "+mm.getTime());
                                list.add(mm);
                               
                        }
                        System.out.println("----------------------------------");
                        for(MyObj mm2:list){
                                mm2.setCount(new Text(String.valueOf(count)));
                                System.out.println("放入list之后time值      "+mm2.getUser()+" "+mm2.getTime());
                        }
                       
                       
                }
               
        }
这是reduce的整个代码

点评

我觉得你写的有些不对劲,哪天我整一个吧  发表于 2014-6-2 16:39
回复

使用道具 举报

村长 发表于 2016-4-12 11:22:47
怎么没人考虑用hbase来实现呢
回复

使用道具 举报

12下一页
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

关闭

推荐上一条 /2 下一条