数据挖掘实验报告
Spark迭代计算之通话记录分析
二〇一八年十二月
本项目课题是来自于大学生的项目结课作业,所以我所了解的相关的基于数据挖掘的客户通话数据分析项目正是为了解决从不同的角度对移动企业的收益情况进行分析,用不同方法进行呼叫特征分析和品牌业务的预测,建立数据挖掘的客户通话数据分析系统,着重针对相关的通话记录表、号码信息表等数据资源,利用数据挖掘技术对客户通话信息进行分析,从而对高层次决策人员提供辅助决策支持。在现今激烈的电子信息行业竞争环境下,有效利用数据分析手段,解决商务运营问题有着非常重要的意义。
1、显示呼出电话的所有日期、电话号码、通话时长、及通话类型
2、输出每一日期的所有通话的次数
3、按时间递增顺序排列出每一电话号码的通话记录
4、查询电话号码18211360627的所有信息
5、查询所有电话的电话号码、通话时长、类型
6、查询2017-01-03的所有通话信息
7、以(日期,(电话号码,类型))嵌套键值对的形式显示通话记录
8、查询每一天的通话记录的总次数并依据日期的前后进行排序
9、查询每一电话号码的通话记录的次数并且分组排序
10、按每一电话号码的通话记录时间递增顺序排列出它的通话记录。
(二)项目实现(项目架构)
1、通过Flume工具将call_records表和number_field表导入到HDFS中保存;
2、通过Loader工具将MySQL中的call_records表和number_field表导入Spark中分析;
2、使用MapReduce对HDFS中的数据进行清洗,清洗要求去除错误字段,补充不完整字段,并根据Spark分析需求取出所涉及字段按照一定格式保存到HDFS中。清洗之后要求保留如下字段:
Call_record表中:type 通话类型;Call_duration 通话时长;Phone_number手机号;Phone_data 通话日期;
number_field维表中:id 编号;Number_bigint 字段号;Card_type 电话卡的类型;City 城市;Area 区号;
3、将MapReduce清洗后的数据导入Spark中,使用Spark对清洗后的数据和从MySQL中导入的数据进行统计分析。具体统计分析内容见“项目需求”;
本项目需要出来的数据包括本地MySQL数据库中的call_record维表和number_field维表。
由老师提供项目所需要的相关数据,并且提前把它放在集群外某个节点的指定目录下(节点IP地址为10.51.46.108。指定目录为/home/zhangyu/liwen);并生成项目所需相关数据以维表的方式存入MySQL数据库中(数据库所在节点的IP地址为10.51.46.108,可以通过SSH方式访问,用户名为zhangyu,密码为zhangyu),生成call_record维表和number_field维表,通过这些操作得到最后想要的相关结果。
1、call_record维表
Type |
通话类型 |
Call_duration |
通话时长 |
Phone_number |
手机号 |
Phone_data |
通话日期 |
2、number_field维表
id |
编号 |
Number_bigint |
字段号 |
Card_type |
电话卡的类型 |
City |
城市 |
Area |
区号 |
相关文件的导入以及前期的相关准备工作
val rdd1=sc.textFile("hdfs:///spark/call_records.txt")
val rdd2=sc.textFile("hdfs:///spark/number_field.txt")
val split = rdd1.filter(a => a.contains("呼出")).saveAsTextFile("/zz/cc")
val rdd1=sc.textFile("hdfs:///spark/call_records.txt")
val rdd2=sc.textFile("hdfs:///spark/number_field.txt")
rdd1.map(line=> (line.split('\t')(0),1)).reduceByKey(_+_).collect
val rdd1=sc.textFile("hdfs:///spark/call_records.txt")
val rdd2=sc.textFile("hdfs:///spark/number_field.txt")
rdd1.map(line => ( line.split('\t')(1).toString, line.split('\t')(0) ) ).sortByKey(true).collect
val rdd1=sc.textFile("hdfs:///spark/call_records.txt")
val rdd2=sc.textFile("hdfs:///spark/number_field.txt")
val split = rdd1.filter(a => a.contains("18211360627")).collect
val rdd1=sc.textFile("hdfs:///spark/call_records.txt")
val rdd2=sc.textFile("hdfs:///spark/number_field.txt")
val rdd11 =rdd1.map(line => (line.split('\t')(1),(line.split('\t')(2),line.split('\t')(3)) ) ).collect
val rdd1=sc.textFile("hdfs:///spark/call_records.txt")
val rdd2=sc.textFile("hdfs:///spark/number_field.txt")
val spilt = rdd1.filter(a => a.contains("2017-01-03")).collect
val rdd1=sc.textFile("hdfs:///spark/call_records.txt")
val rdd2=sc.textFile("hdfs:///spark/number_field.txt")
val rdd11 =rdd1.map(line => (line.split('\t')(0),(line.split('\t')(1),line.split('\t')(3)) ) ).collect
val rdd1=sc.textFile("hdfs:///spark/call_records.txt")
val rdd2=sc.textFile("hdfs:///spark/number_field.txt")
val rdd11=rdd1.map(line => ( line.split('\t')(1).toString,(line.split('\t')(0).toString, line.split('\t')(2) ) ) ).sortByKey(true).collect
val rdd1=sc.textFile("hdfs:///spark/call_records.txt")
val rdd2=sc.textFile("hdfs:///spark/number_field.txt")
rdd1.map(line=> (line.split('\t')(1),1)).reduceByKey(_+_).collect