实战hadoop海量数据处理系列04预热篇:窗函数row_number 从理论到实践

释放双眼,带上耳机,听听看~!

实战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页面监控信息网址

以默认的端口来说,

  1. http://master:50030

查看MapReduce上的jobtracker(在启动了hdfs和MapReduce之后查阅)

  1. http://master:50060

查看MapReduce上的tasktracker(在启动了hdfs和MapReduce之后查阅)

  1. http://master:50070

查看HDFS上的节点信息(在启动了HDFS之后查阅)

  1. http://master:60010/master.jsp

查看master连点信息 (在启动了HDFS、MapReduce、ZooKeeper和HBase之后查阅)

  1. http://master:60030/regionserver.jsp

查看regionserver信息(在启动了HDFS、MapReduce、ZooKeeper和HBase之后查阅)

  1. http://master:60010/zk.jsp

查看zookeeper信息(在启动了HDFS、MapReduce、ZooKeeper和HBase之后查阅)

给TA打赏
共{{data.count}}人
人已打赏
安全运维

MySQL和MongoDB数据相互迁移

2021-12-11 11:36:11

安全运维

Ubuntu上NFS的安装配置

2021-12-19 17:36:11

个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
搜索