[基础工具]离线数据立方体构建工具
来源:互联网 发布:社交网络无字幕版 编辑:程序博客网 时间:2024/06/05 18:08
1. 背景
在数据的实际使用过程中,我们经常需要进行多维度的组合汇总,做一个数据立方体。常见的方法是在各个维度下进行group by,建立多个任务,这样不利于代码查看和维护,同时也浪费开发时间。
数据立方体与OLAP:http://webdataanalysis.net/web-data-warehouse/data-cube-and-olap/
2. 数据立方体
业务场景
有一张数据表的结构如下
现在有一系列的查询需求
- 查看服务器ip、服务接口名、指定错误码下的接口调用次数、接口调用总耗时;
- 查看服务器ip下所有的接口调用次数、接口调用总耗时;
- 查看错误码下所有的接口调用次数、接口调用总耗时;
- 查看服务器ip、错误码下所有的接口调用次数、接口调用总耗时;
……
上面各种查询需求,都是针对不同维度进行组合统计的,用最笨的办法,可能需要写一堆group by xxx,但通过建立数据立方体,就可以在对某个(些)维度进行汇总统计时进行上卷等操作。
问题简化
建立数据立方体之前,先要明确需要处理哪些维度、指标。下面是一个数据立方体
维度1组合 ✔️
维度2组合
✔️
维度3组合
✔️
维度12组合 ✔️ ✔️
维度13组合 ✔️
✔️
维度23组合
✔️ ✔️
维度123组合 ✔️ ✔️ ✔️
问题分析
实际上对于每个维度而言,是“组合”与“不组合”两种可能,因此 M 个维度对应的组合数是
3. 构建数据立方体
本文将使用hive streaming + python构建数据立方体
Hive Tranform方式的官方文档:https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Transform
如上图,hive streaming方式实际上是将hive sql查询的记录,逐条传递给jar/python等进行处理。构建数据立方体的过程,是需要对每条明细数据处理
3.1. Python代码
cube.py
def binary_reflect_gray_code(n): """ 生成n位的二进制反格雷码, 即n个元素的全组合 :param n: :return: """ if n == 1: return ["0", "1"] L1 = binary_reflect_gray_code(n-1) L2 = copy.deepcopy(L1) L2.reverse() L1 = ["0" + l for l in L1] L2 = ["1" + l for l in L2] L = L1 + L2 return Lif __name__ == "__main__": not_group_set = [] if len(sys.argv) < 4: print 'Error! Not Enough Params.' print 'Usage: python cube.py <field_num> <dimension_num> <> <not_group_set>' sys.exit(1) elif len(sys.argv) > 4: _, field_cnt, dimension_cnt, split_sign = sys.argv[0:4] not_group_set = sys.argv[4:] elif len(sys.argv) == 4: _, field_cnt, dimension_cnt, split_sign = sys.argv[0:4] combination_list = binary_reflect_gray_code(dimension_cnt) for line in sys.stdin: kv = line.replace('\n', '').split('\t') for combination in combination_list: if combination not in not_group_set: for item in range(int(field_cnt)): if item < int(dimension_cnt): if combination[item] == '0': print '%s\t' % (kv[item]), else: print '%s\t' % (split_sign), else: print '%s\t' % (kv[item]), print
3.2. 参数说明
3.3. 使用说明
1) 新建文件cube.sql
,添加如下HQL脚本
add file cube.py;select fserver_ip, finterface, ferr_code, sum(fcall_num) as fcall_num, sum(fcall_time) as fcall_timefrom ( from dp_monitor.t_monitor_acc select TRANSFORM(fserver_ip, finterface, ferr_code, fcall_num, fcall_time) using 'python cube.py 5 3 all' as fserver_ip, finterface, ferr_code, fcall_num, fcall_time where fdate = '2017-10-16') tmpgroup by fserver_ip, finterface, ferr_codeorder by fserver_ip, finterface, ferr_code;
2) 使用hive命令行执行HQL脚本
hive -f cube.sql
3.4. 如何进行本地测试
本地导出数据进行测试:
hive -e "select fserver_ip, finterface, ferr_code, fcall_num, fcall_time from dp_monitor.t_monitor_acc where fdate = '2017-10-16' limit 100" > a.txtcat a.txt | python cube.py 5 3 all
3.5. 性能效率
假设:
- 维度数 = M(0 < M <
102 ),脚本会先生成 M 位的二进制组合,M 位的二进制组合共有2M 个; - 表数据 = N(0 < N <
1010 ),脚本会逐条数据进行处理,每条数据会处理2M 次;
时间复杂度为:
- [基础工具]离线数据立方体构建工具
- Gradle构建工具基础
- 阿里 离线数据同步工具 DataX 初试
- 构建工具
- Linux基础——构建工具链
- 前端构建工具gulp的使用基础
- 博客离线发布工具
- 离线地图制作工具
- 离线安装Silverlight 工具
- 离线API查看工具
- 离线安装htop工具
- Markdown 离线编辑工具
- 自动化构建工具--gulp中gulpfile的基础配置
- 在线翻译、词典、离线工具大全
- 使用离线blog工具Zoundry
- 在线翻译、词典、离线工具大全
- 手机离线地图制作工具
- 离线地图生成工具结构图
- PAT
- mysql数据库双向与单向同步
- flume中几种常见的source、channel、sink
- 30天高效练习--第一天
- 分享常见的几种页面静态化的方法
- [基础工具]离线数据立方体构建工具
- 2017第十五届中国(广州)国际专业灯光、音响展览会会刊(参展商名录)
- ASP.Net数据库配置
- 常用的魔术常量。
- LFS gcc第一遍编译问题-
- 思考远比结论更重要(留待优化)
- Celery 浅析
- 【第三届蓝桥杯】移动字母
- Mysql删除重复记录,保留id最小的一条