基于Hadoop平台的电信客服数据的处理与分析④项目实现:任务15:数据生产

任务描述

电信数据生产是一个完整且严密的体系,这样可以保证数据的鲁棒性。在本项目的数据生产模块中,我们来模拟生产一些电信数据。同时,我们必须清楚电信数据的格式和数据结构,这样才能在后续的数据产生、存储、分析和展示环节中正确使用数据,避免可能出现的问题。

任务指导

使用Java代码模拟后续处理需要的数据,此处使用IDEA创建Maven项目在pom.xml文件中引入需要使用的类库和插件。

编写producer.ProductLog类动态生成需要的数据,并将程序打包后测试输出的数据。

任务实现

1、 数据结构

在项目中我们使用HBase来存储数据,HBase中存储的信息包括:两个电话号码,通话开始时间,通话持续时间,以及一个flag作为判断第一个电话号码是否为主叫,姓名字段的存储可以放置在另外一张表中做关联查询,也可以在同一个表中。

列名

说明

示例
call1第一个手机号码15933445689
call1_name第一个手机号码人的姓名李四
call2第二个手机号码18644889345
call2_name第二个手机号码人的姓名张三
date_time建立通话的时间201806291136
date_time_ts建立通话的时间(时间戳)
duration通话持续时间(秒)600
flag标记本次通话第一个字段(call1)是主叫还是被叫1 主叫;2 被叫;

2、 编写代码

在这里我们创建一个Java项目,来模拟电信客服务产生的数据,步骤如下:

1)  激活IDEA

在master1的桌面双击桌面的IDEA Ultimate

如图依次选择【Evaluate for free】=> 【Evaluate】,激活IDEA的30天免费使用权限

再次打开IDEA进入欢迎界面

2)   创建ct_producer项目

点击“New Project”新建一个Java的Maven项目,在“New Project”左侧选择“Maven”后为项目选择所需的“Project SDK”

点击“Next”按钮后在“Name”文本框中输入项目名称“ct_producer”后点击“Finish”按钮。

依次点击“File”->“Settings”进入“Settings”界面,如图为项目制定Maven的相关配置

打开项目的pom.xml文件配置对其进行配置,pom.xml文件内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>org.example</groupId><artifactId>ct_producer</artifactId><version>1.0-SNAPSHOT</version><properties><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding></properties><dependencies><dependency><groupId>junit</groupId><artifactId>junit</artifactId><version>4.12</version><scope>test</scope></dependency></dependencies><build><plugins><plugin><groupId>org.apache.maven.plugins</groupId><artifactId>maven-surefire-plugin</artifactId><version>2.12.4</version><configuration><skipTests>true</skipTests></configuration></plugin></plugins></build>
</project>

如图依次点击“Maven”->"Reload all Maven Projects"后,等待“Build”标签同步(Sync)完成。

3)  完成生产者代码

创建producer包,并在此包创建ProductLog类

ProductLog.java类代码如下

package producer;import java.util.*;
import java.io.*;
import java.text.DecimalFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;public class ProductLog {private String startTime = "2023-01-01";private String endTime = "2023-12-31";//生产数据//用于存放待随机的电话号码private List<String> phoneList = new ArrayList<String>();private Map<String, String> phoneNameMap = new HashMap<String, String>();public void initPhone() {phoneList.add("17078388295");phoneList.add("13980337439");phoneList.add("14575535933");phoneList.add("19902496992");phoneList.add("18549641558");phoneList.add("17005930322");phoneList.add("18468618874");phoneList.add("18576581848");phoneList.add("15978226424");phoneList.add("15542823911");phoneList.add("17526304161");phoneList.add("15422018558");phoneList.add("17269452013");phoneList.add("17764278604");phoneList.add("15711910344");phoneList.add("15714728273");phoneList.add("16061028454");phoneList.add("16264433631");phoneList.add("17601615878");phoneList.add("15897468949");phoneNameMap.put("17078388295", "李雁");phoneNameMap.put("13980337439", "卫艺");phoneNameMap.put("14575535933", "仰莉");phoneNameMap.put("19902496992", "陶欣悦");phoneNameMap.put("18549641558", "施梅梅");phoneNameMap.put("17005930322", "金虹霖");phoneNameMap.put("18468618874", "魏明艳");phoneNameMap.put("18576581848", "华贞");phoneNameMap.put("15978226424", "华啟倩");phoneNameMap.put("15542823911", "仲采绿");phoneNameMap.put("17526304161", "卫丹");phoneNameMap.put("15422018558", "戚丽红");phoneNameMap.put("17269452013", "何翠柔");phoneNameMap.put("17764278604", "钱溶艳");phoneNameMap.put("15711910344", "钱琳");phoneNameMap.put("15714728273", "缪静欣");phoneNameMap.put("16061028454", "焦秋菊");phoneNameMap.put("16264433631", "吕访琴");phoneNameMap.put("17601615878", "沈丹");phoneNameMap.put("15897468949", "褚美丽");}/*** 形式:15837312345,13737312345,2017-01-09 08:09:10,0360*/public String product() {String caller = null;String callee = null;String callerName = null;String calleeName = null;//取得主叫电话号码int callerIndex = (int) (Math.random() * phoneList.size());caller = phoneList.get(callerIndex);callerName = phoneNameMap.get(caller);while (true) {//取得被叫电话号码int calleeIndex = (int) (Math.random() * phoneList.size());callee = phoneList.get(calleeIndex);calleeName = phoneNameMap.get(callee);if (!caller.equals(callee)) break;}String buildTime = randomBuildTime(startTime, endTime);//0000DecimalFormat df = new DecimalFormat("0000");String duration = df.format((int) (30 * 60 * Math.random()));StringBuilder sb = new StringBuilder();sb.append(caller + ",").append(callee + ",").append(buildTime + ",").append(duration);return sb.toString();}/*** 根据传入的时间区间,在此范围内随机通话建立的时间* startTimeTS + (endTimeTs - startTimeTs) * Math.random();** @param startTime* @param endTime*/public String randomBuildTime(String startTime, String endTime) {try {SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd");Date startDate = sdf1.parse(startTime);Date endDate = sdf1.parse(endTime);if (endDate.getTime() <= startDate.getTime()) return null;long randomTS = startDate.getTime() + (long) ((endDate.getTime() - startDate.getTime()) * Math.random());Date resultDate = new Date(randomTS);SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");String resultTimeString = sdf2.format(resultDate);return resultTimeString;} catch (ParseException e) {e.printStackTrace();}return null;}/*** 将数据写入到文件中*/public void writeLog(String filePath) {try {OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream(filePath), "UTF-8");while (true) {Thread.sleep(500);String log = product();System.out.println(log);osw.write(log + "\n");//一定要手动flush才可以确保每条数据都写入到文件一次osw.flush();}} catch (IOException e) {e.printStackTrace();} catch (InterruptedException e2) {e2.printStackTrace();}}public static void main(String[] args) throws InterruptedException {if (args == null || args.length <= 0) {System.out.println("no arguments");return;}ProductLog productLog = new ProductLog();productLog.initPhone();productLog.writeLog(args[0]);}
}

4)  打包:在IDEA的Maven Project视图中进行打包:

image.png

双击“LifeCycle ---package”对项目进行打包。

   打包成功后日志消息回显示“BUILD SUCCESS”,并在项目目录中生成target目录,此目录下包含了打包后的jar文件“ct_producer-1.0-SNAPSHOT.jar”

将“ct_producer-1.0-SNAPSHOT.jar”文件拷贝到/opt/app目录下,目录【/root/IdeaProjects/ct_producer/target】为创建项目时选择的默认目录,如进行了更改请根据实际目录进行操作。

[root@master1 ~]# cd /root/IdeaProjects/ct_producer/target
[root@master1 target]# cp ct_producer-1.0-SNAPSHOT.jar /opt/app/

可以编写bash脚本,用于执行脚本生成日志。

创建/opt/app/productlog.sh文件

[root@master1 ~]# touch /opt/app/productlog.sh

/opt/app/productlog.sh文件内容如下

#!/bin/bash
java -cp /opt/app/ct_producer-1.0-SNAPSHOT.jar producer.ProductLog /opt/app/callLog.csv

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/39256.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

泛微开发修炼之旅--30 linux-Ecology服务器运维脚本

文章链接&#xff1a;30 linux-ecology服务器运维脚本

【初阶数据结构】深入解析循环队列:探索底层逻辑

&#x1f525;引言 本篇将介绍如何实现循环队列并实现过程需要注意的事项&#xff0c;虽然篇幅较小&#xff0c;但是其中逻辑还是值得引人思考的&#xff0c;循环队列可以采用数组或链表实现&#xff0c;这篇将采用数组实现循环队列 &#x1f308;个人主页&#xff1a;是店小二…

mdb转gdb实现过程介绍(2)三种方式实现GDB数据库的读、写,并将实现方式与ArcGIS环境共存配置

一、内容提示 通过解析mdb地理数据库&#xff0c;获取了图层之间的组织结构、空间参考、表字段属性等信息。 下一步&#xff0c;就是将数据输出到GDB中。 下面详细介绍python3.9版本&#xff0c;读写GDB数据的方法&#xff1a; &#xff08;1&#xff09;使用ArcPy创建GDB、读写…

如何在恶意软件攻击后恢复已删除的照片

您是否尝试访问 PC 上的照片&#xff0c;但无法打开或丢失&#xff1f;您的 PC 可能正面临恶意软件攻击。 通常&#xff0c;当恶意软件进入系统时&#xff0c;它会与硬盘上的文件交互并破坏或感染它们。您的 PC 的防火墙和防病毒程序通常足以从 PC 中删除这些恶意文件。然而&a…

Flutter CTO 2024 报告出炉解读,看看有没有你关心的问题

Flutter CTO 2024 是由 LeanCode 主导进行的一次技术调查报告&#xff0c;本次报告数据来自 70 多个国家的 300 名 CTO、CIO 和技术主管&#xff0c;报告包含了 52 个问题、 7 次人物面对面访谈和 10 多位合作伙伴的协助 。 报告里 85% 的受访者拥有超过 5 年的⼯作经验&#…

LineageOs-21.0系统编译问题

&#x1f3c6;本文收录于「Bug调优」专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收藏&&…

机器学习:预测评估8类指标

机器学习&#xff1a;8类预测评估指标 R方值、平均值绝对误差值MAE、均方误差MSE、均方误差根EMSE、中位数绝对误差MAD、平均绝对百分误差MAPE、可解释方差分EVS、均方根对数误差MLSE。 一、R方值 1、说明&#xff1a; R方值&#xff0c;也称为确定系数或拟合优度&#xff…

多语言模型(Multilingual Models)用于推理(Inference)

在深入探讨多语言模型&#xff08;Multilingual Models&#xff09;用于推理&#xff08;Inference&#xff09;的详细内容时&#xff0c;我们需要首先理解多语言模型的基本概念、它们如何工作、为什么它们在现代自然语言处理&#xff08;NLP&#xff09;中变得如此重要&#x…

excel PivotTable 透视表

开发数据导出excel功能&#xff0c;设置导出透视表 数据源&#xff1a; 透视表&#xff1a; 使用插件EPPlus 数据源&#xff1a; IF OBJECT_ID(tempdb..#temptable) IS NOT NULLDROP TABLE #temptable; CREATE TABLE #temptable ( [PROJECT] varchar(50), [PRODUCT_CODE] var…

springboot双学位招生管理系统-计算机毕业设计源码93054

摘 要 科技进步的飞速发展引起人们日常生活的巨大变化&#xff0c;电子信息技术的飞速发展使得电子信息技术的各个领域的应用水平得到普及和应用。信息时代的到来已成为不可阻挡的时尚潮流&#xff0c;人类发展的历史正进入一个新时代。在现实运用中&#xff0c;应用软件的工作…

ruoyi-cloud登录接口实现滑块验证码

一、前言 ruoyi项目默认的验证码是这样的 今天来尝试增加滑块验证码&#xff0c;我们用到的是tianai-captcha。 文档地址&#xff1a;http://doc.captcha.tianai.cloud/ 源码地址&#xff1a;https://gitee.com/tianai/tianai-captcha 下面来看具体的步骤。 二、后端 在g…

从游戏到营销:抽卡机小程序的多维度应用探索

在数字化时代&#xff0c;小程序作为一种轻量级、即用即走的应用形态&#xff0c;正逐步渗透到人们生活的方方面面。其中&#xff0c;抽卡机小程序以其独特的趣味性和互动性&#xff0c;不仅在游戏领域大放异彩&#xff0c;更在营销领域展现出广阔的应用前景。本文将从游戏起源…

ELFK简介

&#x1f468;‍&#x1f393;博主简介 &#x1f3c5;CSDN博客专家   &#x1f3c5;云计算领域优质创作者   &#x1f3c5;华为云开发者社区专家博主   &#x1f3c5;阿里云开发者社区专家博主 &#x1f48a;交流社区&#xff1a;运维交流社区 欢迎大家的加入&#xff01…

Hadoop-11-MapReduce JOIN 操作的Java实现 Driver Mapper Reducer具体实现逻辑 模拟SQL进行联表操作

章节内容 上一节我们完成了&#xff1a; MapReduce的介绍Hadoop序列化介绍Mapper编写规范Reducer编写规范Driver编写规范WordCount功能开发WordCount本地测试 背景介绍 这里是三台公网云服务器&#xff0c;每台 2C4G&#xff0c;搭建一个Hadoop的学习环境&#xff0c;供我学…

文件扫描pdf怎么弄?5个简易高效的文件扫描方法

在繁忙的工作中&#xff0c;我们常常需要将纸质文件快速转换为电子文档&#xff0c;以便于编辑、存储或分享。 无论是合同、报告还是笔记&#xff0c;将这些纸质文件转换为Word格式&#xff0c;不仅能提高工作效率&#xff0c;还能确保信息的安全备份。然而&#xff0c;面对市…

Redis 7.x 系列【16】持久化机制之 AOF

有道无术&#xff0c;术尚可求&#xff0c;有术无道&#xff0c;止于术。 本系列Redis 版本 7.2.5 源码地址&#xff1a;https://gitee.com/pearl-organization/study-redis-demo 文章目录 1. 概述2. 执行原理2.1 Redis 6.x2.1.1 直接写2.1.2 重写 2.2 Redis 7.x2.2.1 Redis 6…

Spring Ioc学习

第二章 Spring IOC 章节内容 Spring IOC技术实现Spring IOC设值注入Spring IOC构造注入 章节目标 掌握Spring IOC技术实现掌握Spring IOC设置注入掌握Spring IOC构造注入 第一节 Spring简介 1. Spring 简介 Spring 是目前主流的 Java 开发框架&#xff0c;是 Java 世界最…

基于Springboot+Vue+mysql仓库管理系统仓库进销存管理系统

博主介绍&#xff1a; 大家好&#xff0c;本人精通Java、Python、C#、C、C编程语言&#xff0c;同时也熟练掌握微信小程序、Php和Android等技术&#xff0c;能够为大家提供全方位的技术支持和交流。 我有丰富的成品Java、Python、C#毕设项目经验&#xff0c;能够为学生提供各类…

【Python】Python中的数据类型

数据类型 导读一、数据类型的分类1.1 Number&#xff08;数字&#xff09;1.1.1 静态数据类型1.1.2 动态数据类型 1.2 String&#xff08;字符串&#xff09;1.3 bool&#xff08;布尔类型&#xff09; 二、数据类型的转换2.1 隐式类型转换2.2 显式类型转换2.2.1 int(x[,base])…

系统运维面试总结(shell编程)

SYNDDOS攻击&#xff0c;需要判断这个访问是正常访问还是信包攻击&#xff0c;当前这个信包发起的访问数量是多少&#xff0c;例如看到30个信包同时再访问时设置监控报警。 一般选用/dev/urandom生成&#xff0c;但其生成的随机数带有二进制乱码&#xff0c;所以需要tr命令…