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

Hive row_number()使用方法

0条评论6,988次浏览

需求

根据短信月详单实现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
  • 文章总数:79篇
  • 评论总数:280条
  • 分类总数:31个
  • 标签总数:44个
  • 运行时间:1130天

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

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

最新评论
  • 张瑞昌: 有很多,比较常见的是Jacob迭代法,一次迭代O(n^3), 迭代次数不清楚。 如果是手动算的话按照定义求就可以了
  • Anonymous: :mrgreen:
  • lc277: 你好 我想问下一般删除节点要多久,要删除的datanode大概用了 1t,解除授权已经30多小时还没完成,请问是出现什么问题了吗 麻烦告诉下谢谢 qq1844554123
  • Anonymous: 你好 我想问下一般删除节点要多久,要删除的datanode大概用了 1t,解除授权已经30多小时还没完成,请问是出现什么问题了吗
  • Anonymous: :smile: :grin: :eek:
  • 李雪璇: 想要完整代码,可以帮忙发给我吗
  • Anonymous: 请问一下,那个 user的推荐结果楼主查看了么? 为什么输入数据 最高是五分,输出结果都是7分8分啥的?怎么设置输出的分数的最 大值?
  • Anonymous: 那个 user的推荐结果楼主查看了么? 为什么输入数据 最高是五分,输出结果都是7分8分啥的?
  • Anonymous: stopGracefullyOnShutdown在yarn- client模式下我测试的无效,你的呢
  • Anonymous: 另外,import的lib包能否发个列表.
  • Anonymous: 部分程序已经无法使用, 另外 你的import代码 也应该放上来哈
  • wzq: 赞
  • 增达网: 受教了!呵呵!
  • Anonymous: :!: :smile: :oops: :grin: :eek: :shock:
  • 27: :razz: dsa会报错,rsa不会
  • Anonymous: 看错了 忽略我
  • Anonymous: UserSideCF这个类在哪里
  • 晴子: 在主节点初始化CM5数据库的时候报错误:Verifying that we can write to /opt/cm-5.9.0/etc/cloudera-scm -server log4j:ERROR Could not...
  • zhangnew: 就4题 :?:
  • linxh: “ 但要是遇到预先并不知道数组的长度而又需要获取正确的(或者称之 为原始的)split长度时,该如何处理呢。。? ” 印象中可以split函数参数传-1?