实战hadoop海量数据处理系列04预热篇:窗函数row_number 从理论到实践
作者写第一版书的时候,,hive还没有官方支持row_number,需要使用UDF来实现额外的jar;
不过幸运的是,从hive 0.11过后,官方就加入这个函数,所以入门更容易啦。
1 row_number定义
结合情景分析
row_number()over (partition by tran_idorder by timestamp desc) num
会先根据tran_id进行分组,并在分组内部按timestamp降序排序,row_number()函数计算的值就表示某个tran_id组内部排序后的顺序编号(该编号在一个组内是连续并且唯一的) 。
更多详情,请查看here
2 实践过程
2.1 查看hive表结构
hive> desc cubey;
OK
c1 int
c2 string
Time taken: 0.093 seconds, Fetched: 2 row(s)
2.2 查看hive表的内容
hive> select * from cubey;
OK
1 str1
2 str2
3 str3
3 str31
3 str33
4 str41
4 str42
Time taken: 0.252 seconds, Fetched: 7 row(s)
2.3执行窗函数的查询1
可以看到输出内容按照第一例进行分组,按照第二组进行倒序排序,最后输出一例来表示对应组内的序号。
hive> select c1 ,c2, row_number() over
> ( distrubute by c1 sort by c2 desc) rownum
> from cubey;
(省略若干)
Stage-Stage-1: Map: 1 Reduce: 1 Cumulative CPU: 2.92 sec HDFS Read: 267 HDFS Write: 67 SUCCESS
Total MapReduce CPU Time Spent: 2 seconds 920 msec
OK
1 str1 1
2 str2 1
3 str33 1
3 str31 2
3 str3 3
4 str42 1
4 str41 2
Time taken: 34.029 seconds, Fetched: 7 row(s)
2.4 执行窗函数的查询2
在上一小节的基础上,只取本组的第一条记录
hive> select c1,c2 from (
> select c1,c2 ,row_number() over
> (distribute by c1 sort by c2 desc) rownum
> from cubey )aa
> where aa.rownum = 1;
(省略若干)
Total MapReduce CPU Time Spent: 3 seconds 320 msec
OK
1 str1
2 str2
3 str33
4 str42
Time taken: 27.536 seconds, Fetched: 4 row(s)
3 小结
通过案例实践典型窗函数row_number,对于etl中的关键步骤“去重”有进一步的基础。
4 其他 项目心得及思考
- 得多熟悉hdfs 文件系统的常用命令
比如ls -r - 得多熟悉hadoop /spark等官方example例子
学习来自官方的案例可以少走很多弯路 得理解hadoop内部的排序TeraSort
有一个入门的实现可以去深入理解下,请点击这里[here](http://kubicode.me/2015/06/27/Hadoop/TeraSort-in-Hadoop/
)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之后查阅)