项目github地址:bitcarmanlee easy-algorithm-interview-and-practice
欢迎大家star,留言,一起学习进步

周末加班,拼一条hql花了40min,里面有许多小细节,特别记录下来方便以后使用。

1.表结构

hive表里存的是个thrift结构。我们关注的主要字段如下:

struct UploadDataItem {
1:optional string channel;
2:optional string data;
...
}struct UploadData {
1:required list<UploadDataItem > uploadDataItems;
}struct XXX {
...
10:optional UploadData  uploadData
}

uploadData里面的数据格式如下:

{"uploaddataitems":[{"channel":"xxx","data":"{\"xxx\":\"xxx\",\"time\":1489679985998}","name":"xxx","counter":0,"timestamp":0,"fromsdk":false,"category":"xxx","sourcepackage":null,"id":null,"bucket":0}]}

现在我们的需求就是希望拿到每个bucket里对用的量分别有多少。

2.最终的hql语句

SELECT regexp_extract(a.item.data, '"bucket":(\\d)', 1), COUNT(*)
FROM (SELECT explode(uploadData.uploaddataitems) AS itemFROM push.xmpush_upload_data_internal tablesample(1 percent)WHERE date = 20170318AND deviceinfo.os = '7.3.15') a
WHERE regexp_extract(a.item.data, '"bucket":(\\d)', 1) <> ''
GROUP BY regexp_extract(a.item.data, '"bucket":(\\d)', 1)

3.explode注意事项

因为uploadDataItems里是个list,所以我们需要先用explode将一行变为多行,先生成一个中间虚拟表。explode里面有诸多的注意事项,具体参考之前的文章http://blog.csdn.net/bitcarmanlee/article/details/51926530。

4.解析json字符串

可能是因为json格式实在太过灵活,个人感觉hive对json的支持不是特别好。所以干脆直接用正则匹配的方式来得到bucket后面对应的具体值。hive正则相关的内容,请参考之前的文章http://blog.csdn.net/bitcarmanlee/article/details/51106726

5.空字符串的处理

因为data的类型是个string,而且bucket不一定每次都出现,所以经常出现正则匹配出来为空的情况。一则我们需要为空的情况,二来为空的情况多了以后特别容易造成数据倾斜,所以我们需要将这种情况排除掉。hive空值的底层存储比较复杂与混乱,具体可以参考本文
http://blog.csdn.net/lsxy117/article/details/50387324。本例中空值的情况为’’。

6.先对数据抽样

当表的数据比较大的时候,可以先对表进行抽样,得到数据的抽样结果,可以快速验证逻辑正确性。例子中的tablesample(1 percent)就是对表进行1%的抽样。

一条拼了40min的hql引发的思考相关推荐

  1. 一条凭空消失的短信引发的思考

    [i]一条凭空消失的短信,引发了一个信管人深深的思考,究竟是什么原因,造成了奇怪的现象.因为发生在午夜十二点多,某种神奇的力量删除了短信,还是手机系统的一个Bug.那为什么使用了整整一年第一次发生这样 ...

  2. Python | 一万多条拼车数据,看春运的迁徙图

    作者 | 白苏,医疗健康领域产品经理一枚,Python&R爱好者 来源 | InThirty 编辑 | Jane 今天是腊月二十八,你们都到家了吗?这篇文章,作者对北京.上海.广州.深圳.杭州 ...

  3. mongodb添加多条数据_分析了一万多条拼车数据,看看北上广深的各位都回哪过年...

    快过年了,很多同学都踏上了返乡的路.现在交通这么发达,除了高铁飞机外,还可以搭顺风车回家.今天的这篇文章我们就来分析一下拼车数据,看看今年大家都回哪儿过年. 分析了一万多条拼车数据,看看北上广深的各位 ...

  4. Python看春运,万条拼车数据背后的春节迁徙地图

    Python看春运,万条拼车数据背后的春节迁徙地图 今天是正月初九,春运返程也已过半.这篇文章,作者对北京.上海.广州.深圳.杭州等地 1万多条出行数据进行分析,得出了一些有意思的结论,并且绘制了这几 ...

  5. 过椭圆外一点引两条切线方程_过椭圆上任意一点的切线方程引发的思考与结论...

    过椭圆上任意一点的切线方程引发的思考与结论 邓魁甲 江西省赣州市第三中学 341000 最近笔者在讲授高三第一轮复习时遇见复习资料上一个题目:过椭圆外一点 向椭圆 作切线,与椭圆切于 两点,可知经过 ...

  6. 一个分组查询引发的思考

    一个分组查询引发的思考 我们在看项目代码或者SQL语句时, 往往会看到很多非常复杂的业务或者SQL 那么问题来了. 复杂SQL是如何写成的? 下面通过一个数据展示的需求来体会到复杂的SQL是如何书写的 ...

  7. 由熊猫烧香引发的思考

    由熊猫烧香引发的思考 早期的计算机病毒诞生,作者是以技术炫耀为主,编写这类病毒需要更深入的了解系统及网络技术,开发功底也要更深厚.现阶段,一个合格的程序员,制造出具备破坏性的代码,已经不怎么难.甚至, ...

  8. C语言中递归什么时候能够省略return引发的思考:通过内联汇编解读C语言函数return的本质...

    C语言中递归什么时候能够省略return引发的思考:通过内联汇编解读C语言函数return的本质 事情的经过是这种,博主在用C写一个简单的业务时使用递归,因为粗心而忘了写return.结果发现返回的结 ...

  9. 【汇编语言与计算机系统结构笔记01】x86/MIPS/ARM指令集概述与特性,一篇HPCA引发的思考(商业生态的决定性作用)

    资源Bilibili AV46914471 + AV57921488 汇编语言与计算机系统结构 清华大学 张悠慧 本次笔记内容: 01.汇编语言与计算机系统结构 02.汇编基础知识--指令集综述 文章 ...

  10. 由n阶幻方问题引发的思考

    由n阶幻方问题想到的 前序 最近在学习一些经典的算法,搞得头昏脑涨,就想换换脑子.在家里的旧书堆里面乱翻,无意中将一本具有十多年历史的小学数学奥林匹克竞赛的书发掘了出来,能放到现在挺不容易的,就拿起来 ...

最新文章

  1. 使用 AngularJS NodeJS 实现基于token 的认证应用(转)
  2. 【项目实战】:基于python的p2p运营商数据信息的特征挖掘
  3. Xshell更改命令提示符以及背景配色
  4. 设计模式之职责链模式
  5. Windows下的ssh姐妹花 Xshell 和 Xftp
  6. prototype.js 和jquery-1.6.2.js冲突问题解决方法
  7. 领域驱动设计,让程序员心中有码(六)
  8. e盾服务端源码_原罪西游源码发布!!!
  9. html2json文档,插件 jQuery.json2html 中文 API 文档
  10. f4 OF DATE FIELD IN DYNPRO PROGRAME
  11. vmware之centos7 删除分区
  12. 感性负载与容性负载的区别
  13. 关于作虚拟软盘启动(转)
  14. Assassin’s Creed(hdu4415,贪心)
  15. 原来Mysql索引要这么设计才能起飞
  16. 中国十大无线耳机排行榜,音质好配置高的蓝牙耳机分享
  17. 芝诺数解|【二】风禾尽起,且住为佳——重庆租房
  18. 【漏洞发现-1】操作系统之漏洞探针类型及利用
  19. 萨姆休斯顿州立大学计算机专业,美国萨姆休斯顿州立大学校园环境
  20. 电池-外部DC双电源供电设备电源自动切换电路分享(上)

热门文章

  1. 在Android中实现一个简易的Http服务器
  2. 通过名称识别和处理弹出窗口
  3. Java计算接口请求时间
  4. tortoiseHg查看后一个版本和parent版本的不同
  5. LeetCode 951. Flip Equivalent Binary Trees
  6. anaconda python36 tensorflow virtualenv
  7. 微软Exchange Server 2010 SP1下载
  8. 23_Shell语言————位置变量($@、$、$#、shift)
  9. 如何修正Linux下面MySQL中文乱码问题
  10. linux内核双向链表学习