实战hadoop海量数据处理系列04预热篇:窗函数row_number 从理论到实践
作者写第一版书的时候,,hive还没有官方支持row_number,需要使用UDF来实现额外的jar;
不过幸运的是,从hive 0.11过后,官方就加入这个函数,所以入门更容易啦。
1 row_number定义
结合情景分析
1
2 1row_number()over (partition by tran_idorder by timestamp desc) num
2
会先根据tran_id进行分组,并在分组内部按timestamp降序排序,row_number()函数计算的值就表示某个tran_id组内部排序后的顺序编号(该编号在一个组内是连续并且唯一的) 。
更多详情,请查看here
2 实践过程
2.1 查看hive表结构
1
2
3
4
5
6 1hive> desc cubey;
2OK
3c1 int
4c2 string
5Time taken: 0.093 seconds, Fetched: 2 row(s)
6
2.2 查看hive表的内容
1
2
3
4
5
6
7
8
9
10
11 1hive> select * from cubey;
2OK
31 str1
42 str2
53 str3
63 str31
73 str33
84 str41
94 str42
10Time taken: 0.252 seconds, Fetched: 7 row(s)
11
2.3执行窗函数的查询1
可以看到输出内容按照第一例进行分组,按照第二组进行倒序排序,最后输出一例来表示对应组内的序号。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16 1hive> select c1 ,c2, row_number() over
2 > ( distrubute by c1 sort by c2 desc) rownum
3 > from cubey;
4(省略若干)
5Stage-Stage-1: Map: 1 Reduce: 1 Cumulative CPU: 2.92 sec HDFS Read: 267 HDFS Write: 67 SUCCESS
6Total MapReduce CPU Time Spent: 2 seconds 920 msec
7OK
81 str1 1
92 str2 1
103 str33 1
113 str31 2
123 str3 3
134 str42 1
144 str41 2
15Time taken: 34.029 seconds, Fetched: 7 row(s)
16
2.4 执行窗函数的查询2
在上一小节的基础上,只取本组的第一条记录
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15 1hive> select c1,c2 from (
2 > select c1,c2 ,row_number() over
3 > (distribute by c1 sort by c2 desc) rownum
4 > from cubey )aa
5 > where aa.rownum = 1;
6
7(省略若干)
8Total MapReduce CPU Time Spent: 3 seconds 320 msec
9OK
101 str1
112 str2
123 str33
134 str42
14Time taken: 27.536 seconds, Fetched: 4 row(s)
15
3 小结
通过案例实践典型窗函数row_number,对于etl中的关键步骤“去重”有进一步的基础。
4 其他 项目心得及思考
- 得多熟悉hdfs 文件系统的常用命令
比如ls -r
- 得多熟悉hadoop /spark等官方example例子
学习来自官方的案例可以少走很多弯路
- 得理解hadoop内部的排序TeraSort
有一个入门的实现可以去深入理解下,请点击这里here
- jar包查看class等的命令
一般用jar tf test.jar 来查看jar包内的clas,
有些时候,我们需要查看一个jar文件中是否包含了某个方法,这个在linux下可以通过下面的命令来查询
grepjar methodName class.jar
4.1 活用hive的job日志
当触发hive map reduce的工作不是期望的,可以查看日志,该日志一般在/tmp/
4.2 得熟悉 常用的hadoop页面监控信息网址
以默认的端口来说,
查看MapReduce上的jobtracker(在启动了hdfs和MapReduce之后查阅)
查看MapReduce上的tasktracker(在启动了hdfs和MapReduce之后查阅)
查看HDFS上的节点信息(在启动了HDFS之后查阅)
查看master连点信息 (在启动了HDFS、MapReduce、ZooKeeper和HBase之后查阅)
查看regionserver信息(在启动了HDFS、MapReduce、ZooKeeper和HBase之后查阅)
查看zookeeper信息(在启动了HDFS、MapReduce、ZooKeeper和HBase之后查阅)