程序员的自我修养
Home » Apache Hive » Hive row_number()使用方法

Hive row_number()使用方法

0条评论10,077次浏览

需求

根据短信月详单实现Top 10短信联系人的功能。就是计算出每个号码发送短信最多的10个号码(由于电信业务规则,接收到的短信不会产生记录,所以只能计算发送短信最多的10个号码)。

数据全部通过datax从oracle导入到hdfs上,然后通过hive外部表的形式进行管理。

第一步

初步一看貌似用原生MapReduce比较好解决,毕竟以前用MR处理过类似的需求。但是最近刚刚建议老总将能转移到hive上用sql实现的业务全部转移过来,于是想想还是尝试用sql实现吧。

首先先试试根据发送短信号码、接收短信号码group来计算每个号码对的短信次数。

由于called_nbr字段数据很杂乱,有的手机号前面会加上86变成13位,有的会加上各种17xxx这样的前缀,所以需要数据清洗下。测试时加上limit限制,结果如下:

第二步

接下来就是需要以发送号码为一个group,在group内部根据发送次数count来进行排序。此时就需要使用到row_number()来进行处理。

其中distribute by意思是根据billing_nbr来分组,sort by表示根据count来进行排序,由于billing_nbr是key,所以相同的记录会放在同一个reduce中进行处理。输出结果:

第三步

此时可以选择将上面的数据转换成为一个大宽表,如billing_nbr,top01_nbr,top01_count,top02_nbr,...,top10_count这样的形式。转换方式如下:

此时输出的topN_nbr会是array的类型。

不过设计数据仓库之初就将该字段设定为array类型,且只有一个字段,所以最后将10个号码变成一个array来存放:

根据运行结果对比上面的结果可以看到每个array内部是根据count排好序的。

(转载本站文章请注明作者和出处 程序员的自我修养 – SelfUp.cn ,请勿用于任何商业用途)
分类:Apache Hive
标签:
发表评论


profile
  • 文章总数:81篇
  • 评论总数:400条
  • 分类总数:32个
  • 标签总数:45个
  • 运行时间:1582天

大家好,欢迎来到selfup.cn。

这不是一个只谈技术的博客,这里记录我成长的点点滴滴,coding、riding and everthing!

最新评论