立即注册 登录
About云-梭伦科技 返回首页

redhat1986的个人空间 https://aboutyun.com/?6183 [收藏] [复制] [分享] [RSS]

日志

Hive 面试题

热度 2已有 1794 次阅读2015-6-2 10:37 |个人分类:面试题

表结构:

      uid        datetime                device_id      xxx     xxx

      111      2015-06-01 12:00    DDD_DDD     xx       xx

      111      2015-06-01 12:10    DDD_DDD     xx       xx

      111 2015-06-01 15:00         DDD_DDD     xx     xx

      111 2015-06-01 15:20          DDD_DDD    xx      xx

      112      2015-06-01 13:00      DDD_DDs    xx       xx

      112     2015-06-01 13:00      DDD_DDs    xx       xx

device_id      是设备Id  唯一的;要计算出每个设备一天之内在系统中停留了多长时间,如DDD_DDD   在2015-06-01 共停留30分钟。

补充说明:

表里的每条记录都是原始数据,有可能是登录时间或者退出时间,假如约定两条记录的时间小于半小时(或一小时,这个可以自己约定)就认为是这一次的登录和退出。把所有的登录和退出中间的时间加起来就是当天的停留时间

 


路过
1

雷人

握手
1

鲜花

鸡蛋

刚表态过的朋友 (2 人)

发表评论 评论 (1 个评论)

回复 redhat1986 2016-4-13 20:29
时隔近一年自己回答这个题:
1   编写目的

hadoop二次排序是做日志分析的最基础算法,而且对于初次学hadoop的人很难理解。所以特意写了这篇文档


2   业务背景

在计算visits的时候是一个很常见的需求。比如

原始日志为

用户标识为11111的 1点00 访问页面page1

用户标识为11111的 1点01 访问页面page2

用户标识为11111的 1点05 访问页面page3

用户标识为22222的 1点00 访问页面page1

用户标识为22222的 1点05 访问页面page3,



你需要统计结果为

用户11111 1:00的入口是 page1,出口是page3,访问3个页面,停留时间为5分钟

用户22222 1点00的入口是page1,出口是page3,访问2个页面,停留时间为5分钟
3   实现步骤

实现简要步骤为

1.       构造(用户标识,时间)作为key, 时间和其他信息(比如访问页面)作为value,然后进入map流程

2.       在缺省的reduce的,传入参数为 单个key和value的集合,这会导致相同的用户标识和相同的时间被分在同一组,比如用户标识为11111的 1点00一个reduce, 用户标识为11111的 1点01另外一组,这不符合要求.所以需要更改缺省分组,需要由原来的按(用户标识,时间)改成按(用户标识)分组就行了。这样reduce是传入参数变为

户标识为11111 的value集合为(1点00 访问页面page1, 1点01 访问页面page2, 1点05 访问页面page3),然后在reduce方法里写自己的统计逻辑就行了。

3.       当然1和2步之间,有2个重要细节要处理:确定key的排序规则和确定分区规则(分区规则保证map后分配数据到reduce按照用户标识来散列,而不是按缺省的用户标识+时间来散列)
4   实现详细步骤

  参考http://p-x1984.iteye.com/blog/800269,里面写的很详细。


5   问题解释
5.1       reduce的传入参数和输出可以不一样吗?

当然可以不一样,个人认为这就是map-reduce的精髓之一。对数据进行处理后产生其他格式的输出,然后这个格式必须是(key,value)对

顺便说一下maper的输出是必须和reduce的输入有严格的匹配关系的

mapper的功能在于把数据拆分成(key,value)对

reduce的功能在于对(key, vaule的集合)进行加工产生新的(key,value)对
5.2        reduce的key为啥我觉得应该是个集合呢?

解释:key为(用户标识,时间),当你改了缺省分组为(用户标识)后,key的确变成集合了,但是为了符合reduce是key传入参数规范,我猜测系统内部就取第一行记录作为key值,这样就把集合转化为单个成员了。

举例:key (用户标识为11111,1点00), (用户标识为11111,1点01) (用户标识为11111,1点05) 按用户11111进行分组后,他会取(用户标识为11111,1点00)作为key值,其他2个key值就被丢弃了。注意value可没有丢弃哦,而是合并到key=(11111,1点00)中去了


5.3       分区规则用缺省的可以吗?

不可以,会导致错误的结果。因为缺省用户标识+时间来散列,所以相同用户标识的会被分配到其他的机器的reduce来运算,导致结果错误。比如key(用户标识为11111,1点00)被扔到机器a处理,比如key (用户标识为11111,1点01) 被扔到机器b处理了,通过更改分区规则来达到所有的用户标识为11111都在机器a处理。


5.4       必须定义键的排序规则吗

必须定义,否则系统不知道如何进行排序,比如11111,1点00在前面还是11111,1点01。




6   更近一步的需求

实际的业务需求会更加的复杂,但是实现框架是一样的

需求为:

log日志有更多的信息,

举例如下:

用户标识为11111的 2点01 访问页面page5

用户标识为11111的 2点05 访问页面page6



用户11111 2点01的入口是 page5,出口是page6,访问2个页面,停留时间为4分钟

(这个用户标识为11111的 2点01 需要和 用户11111 1:00的 分开来 )



实现:

仅仅需要把自己reduce的逻辑变得更加复杂一点了,reduce的逻辑要进行数据的分割就行了。

http://blog.sina.com.cn/s/blog_70324d8d0100wa63.html

facelist doodle 涂鸦板

您需要登录后才可以评论 登录 | 立即注册

关闭

推荐上一条 /2 下一条