Hive面试题,求高手帮忙

头疼 2013-04-03 06:07:58
有一张很大的表:TRLOG
该表大概有2T左右
TRLOG:
CREATE TABLE TRLOG
(PLATFORM string,
USER_ID int,
CLICK_TIME string,
CLICK_URL string)
row format delimited
fields terminated by '\t';

数据:
PLATFORM USER_ID CLICK_TIME CLICK_URL
WEB 12332321 2013-03-21 13:48:31.324 /home/
WEB 12332321 2013-03-21 13:48:32.954 /selectcat/er/
WEB 12332321 2013-03-21 13:48:46.365 /er/viewad/12.html
WEB 12332321 2013-03-21 13:48:53.651 /er/viewad/13.html
WEB 12332321 2013-03-21 13:49:13.435 /er/viewad/24.html
WEB 12332321 2013-03-21 13:49:35.876 /selectcat/che/
WEB 12332321 2013-03-21 13:49:56.398 /che/viewad/93.html
WEB 12332321 2013-03-21 13:50:03.143 /che/viewad/10.html
WEB 12332321 2013-03-21 13:50:34.265 /home/
WAP 32483923 2013-03-21 23:58:41.123 /m/home/
WAP 32483923 2013-03-21 23:59:16.123 /m/selectcat/fang/
WAP 32483923 2013-03-21 23:59:45.123 /m/fang/33.html
WAP 32483923 2013-03-22 00:00:23.984 /m/fang/54.html
WAP 32483923 2013-03-22 00:00:54.043 /m/selectcat/er/
WAP 32483923 2013-03-22 00:01:16.576 /m/er/49.html
…… …… …… ……

需要把上述数据处理为如下结构的表ALLOG:
CREATE TABLE ALLOG
(PLATFORM string,
USER_ID int,
SEQ int,
FROM_URL string,
TO_URL string)
row format delimited
fields terminated by '\t';

整理后的数据结构:
PLATFORM USER_ID SEQ FROM_URL TO_URL
WEB 12332321 1 NULL /home/
WEB 12332321 2 /home/ /selectcat/er/
WEB 12332321 3 /selectcat/er/ /er/viewad/12.html
WEB 12332321 4 /er/viewad/12.html /er/viewad/13.html
WEB 12332321 5 /er/viewad/13.html /er/viewad/24.html
WEB 12332321 6 /er/viewad/24.html /selectcat/che/
WEB 12332321 7 /selectcat/che/ /che/viewad/93.html
WEB 12332321 8 /che/viewad/93.html /che/viewad/10.html
WEB 12332321 9 /che/viewad/10.html /home/
WAP 32483923 1 NULL /m/home/
WAP 32483923 2 /m/home/ /m/selectcat/fang/
WAP 32483923 3 /m/selectcat/fang/ /m/fang/33.html
WAP 32483923 4 /m/fang/33.html /m/fang/54.html
WAP 32483923 5 /m/fang/54.html /m/selectcat/er/
WAP 32483923 6 /m/selectcat/er/ /m/er/49.html
…… …… …… ……
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表;(结果是一套SQL)

我的问题是这个UDF应该怎么写
还有,第二题怎么做啊,完全没有方向

等高手帮忙
...全文
2246 9 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
bush8310 2014-06-04
  • 打赏
  • 举报
回复
新手在晕。。。
fvn4edal 2014-01-13
  • 打赏
  • 举报
回复
第一个写法在hive-0.7.1上面运行有问题,估计是row_number的bug,用 select platform, user_id, row_number(user_id),click_time,click_url from trlog group by platform, user_id, click_time,click_url; 代替 select *,row_number(user_id)seq from trlog结果正确。 在hive-0.10上运行成功。大牛的第二种方法简直可以当教科书范例了,佩服!!
头疼 2013-04-03
  • 打赏
  • 举报
回复
引用 6 楼 tntzbzc 的回复:
引用 5 楼 u010134582 的回复: 第一题貌似解决了,但有一点不明白T1\T2既然已经有了row_number(user_id)seq 在最外层还要套个row_number(user_id)seq? 还有第二题能解决吗,不用管效率的,只要能跑通就行 第一题中的RN貌似是HIVE转译SQL的BUG,你可以把外层的ROW_NUMBER去掉,用T1的SEQ,就能发现问题了。 具体……
太强了,第二个也能跑起来 希望能看到其他答案出现,谢谢你了
撸大湿 2013-04-03
  • 打赏
  • 举报
回复
引用 5 楼 u010134582 的回复:
第一题貌似解决了,但有一点不明白T1\T2既然已经有了row_number(user_id)seq 在最外层还要套个row_number(user_id)seq? 还有第二题能解决吗,不用管效率的,只要能跑通就行
第一题中的RN貌似是HIVE转译SQL的BUG,你可以把外层的ROW_NUMBER去掉,用T1的SEQ,就能发现问题了。 具体情况还有待分析,有兴趣可以去国外社区查查相关的BUG LIST。 第二题:

INSERT OVERWRITE TABLE ALLOG
SELECT t1.platform,t1.user_id,t1.seq,t2.click_url FROM_URL,t1.click_url TO_URL FROM
(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
LEFT OUTER JOIN
(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 
on t1.user_id = t2.user_id and t1.seq = t2.seq + 1;
这个完全没有效率可言,MapReduce JOB最少要跑5次,做实验还行,跑生产环境就免了。还不如自己写个JAVA版的MapReduce呢 凑活着用吧
头疼 2013-04-03
  • 打赏
  • 举报
回复
第一题貌似解决了,但有一点不明白T1\T2既然已经有了row_number(user_id)seq 在最外层还要套个row_number(user_id)seq? 还有第二题能解决吗,不用管效率的,只要能跑通就行
撸大湿 2013-04-03
  • 打赏
  • 举报
回复
给你个JAVA写的RowNumber方法

public class RowNumber extends org.apache.hadoop.hive.ql.exec.UDF {

	private static int MAX_VALUE = 50;
	private static String comparedColumn[] = new String[MAX_VALUE];
	private static int rowNum = 1;

	public int evaluate(Object... args) {
		String columnValue[] = new String[args.length];
		for (int i = 0; i < args.length; i++)
			columnValue[i] = args[i].toString();
		if (rowNum == 1)
		{

			for (int i = 0; i < columnValue.length; i++)
				comparedColumn[i] = columnValue[i];
		}

		for (int i = 0; i < columnValue.length; i++)
		{

			if (!comparedColumn[i].equals(columnValue[i]))
			{
				for (int j = 0; j < columnValue.length; j++)
				{
					comparedColumn[j] = columnValue[j];
				}
				rowNum = 1;
				return rowNum++;
			}
		}
		return rowNum++;
	}
}
把这个JAVA打包,编译成JAR包,比如RowNumber.jar。这个你总会吧~~~ 然后放到HIVE的机器上 在HIVE SHELL里执行下面两条语句:
add jar /root/RowNumber.jar; 
#把RowNumber.jar加载到HIVE的CLASSPATH中
create temporary function row_number as 'RowNumber';
#在HIVE里创建一个新函数,叫row_number ,引用的CLASS 就是JAVA代码里的RowNumber
提示成功后,执行下面这条HIVE SQL

#INSERT OVERWRITE TABLE ALLOG 如果要写入ALLOG表,可以把注释去掉
SELECT t1.platform,t1.user_id,row_number(t1.user_id)seq,t2.click_url FROM_URL,t1.click_url TO_URL FROM
(select *,row_number(user_id)seq from trlog)t1
LEFT OUTER JOIN
(select *,row_number(user_id)seq from trlog)t2 
on t1.user_id = t2.user_id and t1.seq = t2.seq + 1;
LZ,你不会是一边面试,一边在网上求助吧
头疼 2013-04-03
  • 打赏
  • 举报
回复
引用 2 楼 u010134582 的回复:
引用 1 楼 tntzbzc 的回复: UDF简单,只要自定义一个ROWNUMBER方法,加载到HIVE中就能出结果了。 tntzbzc ,我是HADOOP新手,能解释的详细点吗,最好有实例代码 引用 1 楼 tntzbzc 的回复: 这第二题有点变态,既然能用UDF,为啥还要用纯HIVE SQL做呢,性能很差的。 有办法做吗,求高手教我。
还有,面试官说,第一题效率一定要高,因为表有2TB 第二题无所谓,只要能用HIVE SQL实现就行
头疼 2013-04-03
  • 打赏
  • 举报
回复
引用 1 楼 tntzbzc 的回复:
UDF简单,只要自定义一个ROWNUMBER方法,加载到HIVE中就能出结果了。
tntzbzc ,我是HADOOP新手,能解释的详细点吗,最好有实例代码
引用 1 楼 tntzbzc 的回复:
这第二题有点变态,既然能用UDF,为啥还要用纯HIVE SQL做呢,性能很差的。
有办法做吗,求高手教我。
撸大湿 2013-04-03
  • 打赏
  • 举报
回复
引用 楼主 u010134582 的回复:
有一张很大的表:TRLOG 该表大概有2T左右 TRLOG: CREATE TABLE TRLOG (PLATFORM string, USER_ID int, CLICK_TIME string, CLICK_URL string) row format delimited fields terminated by '\t'; 数据: PLAT……
这题目咋似曾相识 UDF简单,只要自定义一个ROWNUMBER方法,加载到HIVE中就能出结果了。 这第二题有点变态,既然能用UDF,为啥还要用纯HIVE SQL做呢,性能很差的。

20,848

社区成员

发帖
与我相关
我的任务
社区描述
Hadoop生态大数据交流社区,致力于有Hadoop,hive,Spark,Hbase,Flink,ClickHouse,Kafka,数据仓库,大数据集群运维技术分享和交流等。致力于收集优质的博客
社区管理员
  • 分布式计算/Hadoop社区
  • 涤生大数据
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧