Hive面试题—理清hive应用思路

问题:有一张很大的表:TRLOG该表大概有2T左右。

[sql] view plaincopy
  1. TRLOG:
  2. CREATE TABLE TRLOG
  3. (PLATFORM string,
  4. USER_ID int,
  5. CLICK_TIME string,
  6. CLICK_URL string)
  7. row format delimited fields terminated by '\t';

数据:

[html] view plaincopy
  1. PLATFORM          USER_ID              CLICK_TIME             CLICK_URL
  2. WEB               12332321      2013-03-21 13:48:31.324       /home/
  3. WEB               12332321      2013-03-21 13:48:32.954       /selectcat/er/
  4. WEB               12332321      2013-03-21 13:48:46.365       /er/viewad/12.html
  5. WEB               12332321      2013-03-21 13:48:53.651       /er/viewad/13.html
  6. WEB               12332321      2013-03-21 13:49:13.435       /er/viewad/24.html
  7. WEB               12332321      2013-03-21 13:49:35.876       /selectcat/che/
  8. WEB               12332321      2013-03-21 13:49:56.398       /che/viewad/93.html
  9. WEB               12332321      2013-03-21 13:50:03.143       /che/viewad/10.html
  10. WEB               12332321      2013-03-21 13:50:34.265       /home/
  11. WAP               32483923      2013-03-21 23:58:41.123       /m/home/
  12. WAP               32483923      2013-03-21 23:59:16.123       /m/selectcat/fang/
  13. WAP               32483923      2013-03-21 23:59:45.123       /m/fang/33.html
  14. WAP               32483923      2013-03-22 00:00:23.984       /m/fang/54.html
  15. WAP               32483923      2013-03-22 00:00:54.043       /m/selectcat/er/
  16. WAP               32483923      2013-03-22 00:01:16.576       /m/er/49.html
  17. ……                  ……                ……                                  ……

现需要把上述数据处理为如下结构的表ALLOG:

[sql] view plaincopy
  1. CREATE TABLE ALLOG
  2. (PLATFORM string,
  3. USER_ID int,
  4. SEQ int,
  5. FROM_URL string,
  6. TO_URL   string)
  7. row format delimited fields terminated by '\t';

整理后的数据结构:

[html] view plaincopy
  1. PLATFORM          USER_ID     SEQ             FROM_URL                      TO_URL
  2. WEB               12332321     1               NULL                        /home/
  3. WEB               12332321     2               /home/                      /selectcat/er/
  4. WEB               12332321     3               /selectcat/er/              /er/viewad/12.html
  5. WEB               12332321     4               /er/viewad/12.html          /er/viewad/13.html
  6. WEB               12332321     5               /er/viewad/13.html          /er/viewad/24.html
  7. WEB               12332321     6               /er/viewad/24.html          /selectcat/che/
  8. WEB               12332321     7               /selectcat/che/             /che/viewad/93.html
  9. WEB               12332321     8               /che/viewad/93.html         /che/viewad/10.html
  10. WEB               12332321     9               /che/viewad/10.html         /home/
  11. WAP               32483923     1               NULL                        /m/home/
  12. WAP               32483923     2               /m/home/                    /m/selectcat/fang/
  13. WAP               32483923     3               /m/selectcat/fang/          /m/fang/33.html
  14. WAP               32483923     4               /m/fang/33.html             /m/fang/54.html
  15. WAP               32483923     5               /m/fang/54.html             /m/selectcat/er/
  16. WAP               32483923     6               /m/selectcat/er/             /m/er/49.html
  17. ……                  ……           ……                 ……                             ……

说明:PLATFORM和USER_ID还是代表平台和用户ID;SEQ字段代表用户按时间排序后的访问顺序,FROM_URL和TO_URL分别代表用户从哪一页跳转到哪一页。对于某个平台上某个用户的第一条访问记录,其FROM_URL是NULL(空值)。

解题要求:需要用两种办法做出来:

1、实现一个能加速上述处理过程的Hive Generic UDF,并给出使用此UDF实现ETL过程的Hive SQL。
  2、实现基于纯Hive SQL的ETL过程,从TRLOG表生成ALLOG表;(结果是一套hive SQL语句)。
  说明:第一题效率一定要高,因为表有2TB,第二题无所谓,只要能用HIVE SQL实现就行。

**********解决思路******************

问题一:写UDF简单,只要自定义一个ROWNUMBER方法,加载到HIVE中就能出结果了。
下面是网友提供的一个JAVA写的RowNumber方法(该方法用于获取“SEQ”列的值(SEQ字段代表用户按时间排序后的访问顺序),仅供参考。

[java] view plaincopy
  1. public class RowNumber extends org.apache.hadoop.hive.ql.exec.UDF {
  2. private static int MAX_VALUE = 50;
  3. private static String comparedColumn[] = new String[MAX_VALUE];
  4. private static int rowNum = 1;
  5. public int evaluate(Object... args) {
  6. String columnValue[] = new String[args.length];
  7. for (int i = 0; i < args.length; i++)
  8. columnValue[i] = args[i].toString();
  9. if (rowNum == 1)
  10. {
  11. for (int i = 0; i < columnValue.length; i++)
  12. comparedColumn[i] = columnValue[i];
  13. }
  14. for (int i = 0; i < columnValue.length; i++)
  15. {
  16. if (!comparedColumn[i].equals(columnValue[i]))
  17. {
  18. for (int j = 0; j < columnValue.length; j++)
  19. {
  20. comparedColumn[j] = columnValue[j];
  21. }
  22. rowNum = 1;
  23. return rowNum++;
  24. }
  25. }
  26. return rowNum++;
  27. }
  28. }

把上面这个JAVA类打包,编译成JAR包,比如RowNumber.jar。然后放到Hive的机器上的相应目录下。

然后在HIVE SHELL里执行下面两条语句:

[html] view plaincopy
  1. add jar /root/RowNumber.jar; #把RowNumber.jar加载到HIVE的CLASSPATH中
  2. create temporary function row_number as 'RowNumber';
  3. #在HIVE里创建一个新函数,叫row_number ,引用的CLASS 就是JAVA代码里的RowNumber类。

提示成功后,再执行下面这条HIVE SQL语句:

[html] view plaincopy
  1. #INSERT OVERWRITE TABLE ALLOG 如果要写入ALLOG表,可以把注释去掉
  2. SELECT t1.platform,t1.user_id,row_number(t1.user_id)seq,t2.click_url FROM_URL,t1.click_url TO_URL FROM
  3. (select *,row_number(user_id)seq from trlog)t1
  4. LEFT OUTER JOIN
  5. (select *,row_number(user_id)seq from trlog)t2
  6. on t1.user_id = t2.user_id and t1.seq = t2.seq + 1;

成功实现!
疑        问:第一题解决了,但有一点不明白T1\T2既然已经有了row_number(user_id)seq,为什么在最外层还要套个row_number(user_id)seq?
牛人回答:第一题中的RN貌似是HIVE转译SQL的BUG,你可以把外层的ROW_NUMBER去掉,用T1的SEQ,就能发现问题了。具体情况还有待分析,有兴趣可以去国外社区查查相关的BUG LIST。

问题解题思路二:

[sql] view plaincopy
  1. INSERT OVERWRITE TABLE ALLOG
  2. SELECT t1.platform,t1.user_id,t1.seq,t2.click_url FROM_URL,t1.click_url TO_URL FROM
  3. (SELECT platform,user_id,click_time,click_url,count(1) seq FROM (SELECT a.*,b.click_time click_time1,b.click_url click_url2  FROM trlog a left outer join trlog b on a.user_id = b.user_id)t WHERE click_time>=click_time1 GROUP BY platform,user_id,click_time,click_url)t1
  4. LEFT OUTER JOIN
  5. (SELECT platform,user_id,click_time,click_url,count(1) seq FROM (SELECT a.*,b.click_time click_time1,b.click_url click_url2  FROM trlog a left outer join trlog b on a.user_id = b.user_id)t WHERE click_time>=click_time1 GROUP BY platform,user_id,click_time,click_url )t2
  6. on t1.user_id = t2.user_id and t1.seq = t2.seq + 1;

分析说明:这个方法完全没有效率可言,MapReduce JOB最少要跑5次,做实验还行,跑生产环境就免了。

转自:http://www.360doc.com/content/14/0107/20/15109633_343417196.shtml

Hive面试题—理清hive应用思路相关推荐

  1. Hive面试题:hive中大表和小表join要注意什么

    开启map join, 然后设置合适的split的大小,来增加到合适的mapper数量

  2. Hive面试题系列第三题-用户留存问题

    视频讲解地址:https://www.bilibili.com/video/BV1Rd4y1T7iU/?spm_id_from=333.788&vd_source=aa4fb0436f6d97 ...

  3. Hive面试题系列第七题-同时在线问题

    视频讲解地址: https://www.bilibili.com/video/BV1Tg411r7Jz/?spm_id_from=333.788&vd_source=aa4fb0436f6d9 ...

  4. HIVE面试题原理详解 统计用户连续交易的总额、连续登陆天数、连续登陆开始和结束时间、间隔天数

    HIVE面试题原理详解 统计用户连续交易的总额.连续登陆天数.连续登陆开始和结束时间.间隔天数 友情提示 创建数据表 添加数据 流程图 第一步分析(子表a) 第二步分析(子表b) 第三步分析(子表c) ...

  5. hive相对于oracle的优点,【Hive】Hive面试题

    1.hive的join有几种方式,怎么实现join的? left join --以左表为基准,不符合的值以null值显示 --工作中以left join 居多,大表加载小表的形式 select emp ...

  6. Hive面试题(一)

    目录 1.Hive表关联查询,如何解决数据倾斜的问题 2.谈一下hive的特点,以及hive和RDBMS有什么异同 3.说一下hive中sort by.order by.cluster by.dist ...

  7. Hive面试题考点-整理

    1)Hive数据倾斜问题: 倾斜原因: map输出数据按Key Hash分配到reduce中,由于key分布不均匀.或者业务数据本身的特点.等原因造成的reduce上的数据量差异过大. 1.1)key ...

  8. 面试题整理(Hive)

    1. Hive数据倾斜 原因 key分布不均匀 业务数据本身的特性 SQL语句造成数据倾斜 解决方法 hive设置hive.map.aggr=true和hive.groupby.skewindata= ...

  9. 通过Hive的案例了解Hive在工作中的使用

    通过Hive的案例了解Hive在工作中的使用 笔者学习了HIve有一阵子时间了,但是碍于缺乏项目的实战,所以HQL写的总是别别扭扭,所幸通过一个案例似乎打通了一些对于HiveSQL使用的一些疑惑,故通 ...

最新文章

  1. java获取get请求返回_Java中处理调用第三方接口(post/get),该如何处理,返回的数据如何处理...
  2. python第三方库jieba下载_Python第三方库____jieba
  3. windows下进程间通信的(13种方法)
  4. 我们为什么必须会git和maven
  5. Codeforces 919D - Substring
  6. 实例32:python
  7. VBA GetOpenFilename 方法
  8. Poj1995--Raising Modulo Numbers(快速幂)
  9. 一种极端思维引起的幻觉
  10. 【汇总目录】嵌入式系统技术
  11. 【新版】Android技术博客精华汇总
  12. SQL学习笔记之游标
  13. B站(云e办)SpringBoot实战练习的Sql文件、前端Vue源码、后端springboot源码
  14. 【深度优先搜索】复原IP地址
  15. 【7gyy】密码丢了?揭秘你的密码是如何被偷走的
  16. 手气不错 跳过搜索 谷歌 Google
  17. 如何使用计算机上合并计算方法,excel合并计算的方法步骤详解
  18. Makefile wildcard
  19. Vue子组件的显示与隐藏
  20. 记我的启蒙老师谢朝晖老师

热门文章

  1. 杨辉三角形详解(倒立or正立)
  2. 互联网日报 | 宝马iX3正式中国首发亮相;马上消费金融冲刺消费金融第一股;京东数科拟募资逾两百亿...
  3. 网络安全知识之防范恶意代码
  4. 知乎,你还不赶紧谢谢今日头条
  5. html hdr文件,hdra和hdr的区别是什么
  6. Scrapy框架爬取Boss直聘网Python职位信息的源码
  7. 静走天后宫,食购十四涌
  8. 如何修改聚合后的数据的index
  9. 如何生成WebP图片
  10. 毕业设计基于Springboot框架作业查重系统2.0版本