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

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/titer1/article/details/72956385

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

以默认的端口来说,

  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之后查阅)

展开阅读全文

没有更多推荐了,返回首页