尚硅谷大数据技术之电信客服
———————————————————————————
——
尚硅谷大数据技术之电信客服
(作者:尚硅谷大数据研发部)
版本:V1.1
目录
第 1 章 项目背景.............................................................................................................................. 3
第 2 章 项目架构.............................................................................................................................. 3
第 3 章 项目实现.............................................................................................................................. 3
3.1 数据生产 ............................................................................................................................. 4
3.1.1 数据结构 ..................................................................................................................4
3.1.2 编写代码 ..................................................................................................................5
3.1.3 打包测试 ..................................................................................................................9
3.2 数据采集/消费(存储).........................................................................................................9
3.2.1 数据采集 ................................................................................................................10
3.2.2 数据消费 ................................................................................................................11
3.2.3 数据查询方式一....................................................................................................19
3.2.4 数据查询方式二....................................................................................................26
3.2.5 数据消费方案优化 ................................................................................................29
3.2.6 协处理器 ................................................................................................................32
3.2.7 数据消费测试 ........................................................................................................32
3.3 数据分析 ........................................................................................................................... 34
3.3.1 需求分析 ................................................................................................................35
3.3.2 Mysql 表结构设计 .................................................................................................. 36
3.3.3 环境准备 ................................................................................................................38
3.3.4 需求实现 ................................................................................................................40
3.3.5 运行测试 ................................................................................................................61
3.4 数据展示 ........................................................................................................................... 61
更多 Java –大数据 –前端 –python 人工智能资料下载,可百度访问:尚硅谷官网
尚硅谷大数据技术之电信客服
———————————————————————————
——
3.4.1 环境准备 ................................................................................................................61
3.4.2 编写代码 ................................................................................................................67
3.4.5 最终预览 ................................................................................................................81
3.5 定时任务 ........................................................................................................................... 83
第 4 章 项目总结............................................................................................................................ 83
更多 Java –大数据 –前端 –python 人工智能资料下载,可百度访问:尚硅谷官网
尚硅谷大数据技术之电信客服
———————————————————————————
——
第 1 章 项目背景
通信运营商每时每刻会产生大量的通信数据,例如通话记录,短信记录,彩信记录,第
三方服务资费等等繁多信息。数据量如此巨大,除了要满足用户的实时查询和展示之外,还
需要定时定期的对已有数据进行离线的分析处理。例如,当日话单,月度话单,季度话单,
年度话单,通话详情,通话记录等等+。我们以此为背景,寻找一个切入点,学习其中的方
法论。当前我们的需求是:统计每天、每月以及每年的每个人的通话次数及时长。
第 2 章 项目架构
项目架构如图 1 所示
第 3 章 项目实现
系统环境:
系统
windows
图 1 项目架构
表 1
版本
10 专业版
更多 Java –大数据 –前端 –python 人工智能资料下载,可百度访问:尚硅谷官网
尚硅谷大数据技术之电信客服
———————————————————————————
——
linux
开发工具:
工具
idea
maven
JDK
CentOS 6.8
表 2
版本
2017.2.5 旗舰版
3.3.9
1.8+
提示:idea2017.2.5 必须使用 maven3.3.9,不要使用 maven3.5,有部分兼容性问题
集群环境:
框架
hadoop
zookeeper
hbase
flume
kafka
硬件环境:
表 3
版本
2.7.2
3.4.10
1.3.1
1.7.0
2.11-0.11.0.0
表 4
hadoop102
hadoop103
hadoop104
内存
CPU
硬盘
3.1 数据生产
4G
2 核
50G
2G
1 核
50G
2G
1 核
50G
此情此景,对于该模块的业务,即数据生产过程,一般并不会让你来进行操作,数据生
产是一套完整且严密的体系,这样可以保证数据的鲁棒性。但是如果涉及到项目的一体化方
案的设计(数据的产生、存储、分析、展示),则必须清楚每一个环节是如何处理的,包括
其中每个环境可能隐藏的问题;数据结构,数据内容可能出现的问题。
3.1.1 数据结构
更多 Java –大数据 –前端 –python 人工智能资料下载,可百度访问:尚硅谷官网
尚硅谷大数据技术之电信客服
———————————————————————————
——
我们将在 HBase 中存储两个电话号码,以及通话建立的时间和通话持续时间,最后再
加上一个 flag 作为判断第一个电话号码是否为主叫。姓名字段的存储我们可以放置于另外一
张表做关联查询,当然也可以插入到当前表中。
表 5
列名
call1
解释
举例
第一个手机号码
15369468720
call1_name
第一个手机号码人姓名(非必须) 李雁
call2
call2_name
date_time
第二个手机号码
19920860202
第二个手机号码人姓名(非必须) 卫艺
建立通话的时间
20171017081520
date_time_ts
建立通话的时间(时间戳形式)
duration
通话持续时间(秒)
0600
3.1.2 编写代码
思路:
a) 创建 Java 集合类存放模拟的电话号码和联系人;
b) 随机选取两个手机号码当作“主叫”与“被叫”(注意判断两个手机号不能重复),产出
call1 与 call2 字段数据;
c) 创建随机生成通话建立时间的方法,可指定随机范围,最后生成通话建立时间,产出
date_time 字段数据;
d) 随机一个通话时长,单位:秒,产出 duration 字段数据;
e)、将产出的一条数据拼接封装到一个字符串中;
f)、使用 IO 操作将产出的一条通话数据写入到本地文件中;
新建 module 项目:ct_producer
pom.xml 文件配置:
junit
junit
4.12
test
更多 Java –大数据 –前端 –python 人工智能资料下载,可百度访问:尚硅谷官网
尚硅谷大数据技术之电信客服
———————————————————————————
——
1) 随机输入一些手机号码以及联系人,保存于 Java 的集合中。
新建类:ProductLog
//存放联系人电话与姓名的映射
public Map contacts = null;
//存放联系人电话号码
public List phoneList = null;
public void initContacts() {
contacts = new HashMap();
phoneList = new ArrayList();
phoneList.add("15369468720");
phoneList.add("19920860202");
phoneList.add("18411925860");
phoneList.add("14473548449");
phoneList.add("18749966182");
phoneList.add("19379884788");
phoneList.add("19335715448");
phoneList.add("18503558939");
phoneList.add("13407209608");
phoneList.add("15596505995");
phoneList.add("17519874292");
phoneList.add("15178485516");
phoneList.add("19877232369");
phoneList.add("18706287692");
phoneList.add("18944239644");
phoneList.add("17325302007");
phoneList.add("18839074540");
phoneList.add("19879419704");
phoneList.add("16480981069");
phoneList.add("18674257265");
phoneList.add("18302820904");
phoneList.add("15133295266");
phoneList.add("17868457605");
phoneList.add("15490732767");
phoneList.add("15064972307");
contacts.put("15369468720", "李雁");
contacts.put("19920860202", "卫艺");
contacts.put("18411925860", "仰莉");
contacts.put("14473548449", "陶欣悦");
contacts.put("18749966182", "施梅梅");
contacts.put("19379884788", "金虹霖");
contacts.put("19335715448", "魏明艳");
contacts.put("18503558939", "华贞");
contacts.put("13407209608", "华啟倩");
contacts.put("15596505995", "仲采绿");
contacts.put("17519874292", "卫丹");
contacts.put("15178485516", "戚丽红");
contacts.put("19877232369", "何翠柔");
更多 Java –大数据 –前端 –python 人工智能资料下载,可百度访问:尚硅谷官网
尚硅谷大数据技术之电信客服
———————————————————————————
——
contacts.put("18706287692", "钱溶艳");
contacts.put("18944239644", "钱琳");
contacts.put("17325302007", "缪静欣");
contacts.put("18839074540", "焦秋菊");
contacts.put("19879419704", "吕访琴");
contacts.put("16480981069", "沈丹");
contacts.put("18674257265", "褚美丽");
contacts.put("18302820904", "孙怡");
contacts.put("15133295266", "许婵");
contacts.put("17868457605", "曹红恋");
contacts.put("15490732767", "吕柔");
contacts.put("15064972307", "冯怜云");
}
2) 创建随机生成通话时间的方法:randomDate
该时间生成后的格式为 yyyy-MM-dd HH:mm:ss,并使之可以根据传入的起始时间和结束时
间来随机生成。
//随机生成通话建立时间
private String randomDate(String startDate, String endDate) {
SimpleDateFormat
SimpleDateFormat("yyyy-MM-dd");
try {
simpleDateFormat
=
new
Date start = simpleDateFormat.parse(startDate);
Date end = simpleDateFormat.parse(endDate);
if (start.getTime() > end.getTime()) return null;
long resultTime = start.getTime() + (long) (Math.random() *
return resultTime + "";
e.printStackTrace();
(end.getTime() - start.getTime()));
} catch (ParseException e) {
}
return null;
}
3) 创建生产日志一条日志的方法:productLog
随机抽取两个电话号码,随机产生通话建立时间,随机通话时长,将这几个字段拼接成
一个字符串,然后 return,便可以产生一条通话的记录。需要注意的是,如果随机出的两个
电话号码一样,需要重新随机(随机过程可优化,但并非此次重点)。通话时长的随机为 20
分钟以内,即:60 秒 * 20,并格式化为 4 位数字,例如:0600(10 分钟)。
//拼接日志
private String productLog() {
int call1Index = new Random().nextInt(phoneList.size());
int call2Index = -1;
String call1 = phoneList.get(call1Index);
String call2 = null;
更多 Java –大数据 –前端 –python 人工智能资料下载,可百度访问:尚硅谷官网
尚硅谷大数据技术之电信客服
———————————————————————————
——
while (true) {
call2Index = new Random().nextInt(phoneList.size());
call2 = phoneList.get(call2Index);
if (!call1.equals(call2)) break;
}
//随机生成通话时长(30 分钟内_0600)
int duration = new Random().nextInt(60 * 30) + 1;
//格式化通话时间,使位数一致
String
//通话建立时间:yyyy-MM-dd,月份:0~11,天:1~31
String randomDate = randomDate("2017-01-01", "2018-01-01");
String
DecimalFormat("0000").format(duration);
durationString
new
SimpleDateFormat("yyyy-MM-dd
dateString
=
new
HH:mm:ss").format(Long.parseLong(randomDate));
=
//拼接 log 日志
StringBuilder logBuilder = new StringBuilder();
logBuilder.append(call1).append(",").append(call2).append(",").ap
pend(dateString).append(",")
.append(durationString);
System.out.println(logBuilder);
try {
} catch (InterruptedException e) {
}
return logBuilder.toString();
Thread.sleep(500);
e.printStackTrace();
}
4) 创建写入日志方法:writeLog
productLog 每产生一条日志,便将日志写入到本地文件中,所以建立一个专门用于日志
写入的方法,需要涉及到 IO 操作,需要注意的是,输出流每次写一条日之后需要 flush,不
然可能导致积攒多条数据才输出一次。最后需要将 productLog 方法放置于 while 死循环中执
行。
//将产生的日志写入到本地文件 calllog 中
public void writeLog(String filePath, ProduceLog productLog) {
OutputStreamWriter outputStreamWriter = null;
try {
=
new
OutputStreamWriter(new
FileOutputStream(filePath, true), "UTF-8");
outputStreamWriter
while (true) {
String log = productLog.productLog();
outputStreamWriter.write(log + "\n");
outputStreamWriter.flush();
}
} catch (Exception e) {
e.printStackTrace();
更多 Java –大数据 –前端 –python 人工智能资料下载,可百度访问:尚硅谷官网