通信分析项目总结

该项目是基于通话日志的分析,当前每时每刻都有很多人打电话,那么产生的通话记录也是一个非常大数据量,需求就是根据这个通话日志,统计出每天,每月,每年用户的通话次数以及通话时长。

项目架构

项目中遇到的困难

  1. 数据格式转化有点麻烦

随机产生通话日志,要求数据遵循的格式一致,用到了一个新的api DecimalFormat,DecimalFormat主要是将数字格式化,它拥有两种占位符0 #

1
2
3
4
5
6
7
8
9
10
11
// 0 的用法
//1.情况一 如果0的位数比要格式化的数字位数多 会在不足的位置用0补充
new DecimalFormat(“00.00”).format(3.14) //结果:03.14
//2.情况二 如果0的位数比要格式化的数字位数少 整数位不变,小数部分四舍五入
new DecimalFormat(“0.00”).format(13.146) //结果:13.15

// # 的用法
//1.情况一 如果#的位数比要格式化的数字位数多 不变
new DecimalFormat(“##.###”).format(3.14) //结果:3.14
//2.情况二 如果#的位数比要格式化的数字位数少 整数位不变,小数部分四舍五入
new DecimalFormat(“#.##”).format(13.146) //结果:13.15
  1. hbase预分区以及rowkey的设计

hbase建表时默认只有一个分区,所有数据都会写入到该分区,当数据越来越多时,region会进行split,分成两个reigon,之后,数据写入时会一直往一个region中写入数据,会造成数据热点问题,还有region进行split会消耗集群的io资源,所以需要进行预分区,控制数据的写入,在这个项目中,我总共分了6个分区,分区键为 0|, 1|, 2|, 3|, 4|, 5|.这样,在我往hbase插入数据的时候,就能有效的控制分区了。

为了能够将数据随机插入到给个分区,rowKey设计至关重要,基于分区键的设计,rowkey需要以05这样的数字开头,所以为了可以能够随机的将数据插入到各个分区,在这里,使用了tel和date的hashcode的值,在对分区数进行取模,得到的是05的数字,这样就能够保证数据可以有效的插入到各个分区。

1
2
3
4
5
6
7
8
9
10
11
/**
* rowKey的设计
* 1.长度原则:最大 64kb 推荐10-100byte,最好是8的倍数
* rowKey如果太长,影响性能
* 原因:rowKey如果太长,会占用MemStore,减少缓存的数据
* 2.唯一原则:
* 3.散列原则:
* 盐值散列:不能使用时间戳,在时间戳前面增加一些随机数
* 字符串反转(时间戳,电话号码)
* 计算分区号
*/

3.mysql表的设计

设计了三张表,用户表,日期表,通话日志表

用户表记录用户名 用户电话 

日期表记录日期,包括xxxx年 xxxx年xx月 xxxx年xx月xx日,三种类型的日期,方便进行统计

通话日志表有两个外键,一个外键指向用户表,主要是用于获取电话号码,一个外键指向日期表,用于获取具体的日期。

当时是用一张表来解决的,将电话号码和日期都存在通话日志表中,后来看表中数据的时候感觉冗余数据太多,考虑将表拆分。

文章目录
|
载入天数...载入时分秒...