基于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视图中进行打包:
双击“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
相关文章:

基于Hadoop平台的电信客服数据的处理与分析④项目实现:任务15:数据生产
任务描述 电信数据生产是一个完整且严密的体系,这样可以保证数据的鲁棒性。在本项目的数据生产模块中,我们来模拟生产一些电信数据。同时,我们必须清楚电信数据的格式和数据结构,这样才能在后续的数据产生、存储、分析和展示环节…...

Kotlin中的数据类型
人不走空 🌈个人主页:人不走空 💖系列专栏:算法专题 ⏰诗词歌赋:斯是陋室,惟吾德馨 目录 🌈个人主页:人不走空 💖系列专栏:算法专题 ⏰诗词歌…...

提高交易决策质量,Anzo Capital昂首资本只需两个交易策略
要想提高交易决策质量,其实很简单,Anzo Capital昂首资本只需两个交易策略,结合价格行为和VSA(成交量与价格分析)就可以达成我们的目的。首先,理解这两个概念: 1. 价格行为:价格行为是市场价格变动的方式&a…...

Ubuntu TensorRT安装
什么是TensorRT 一般的深度学习项目,训练时为了加快速度,会使用多 GPU 分布式训练。但在部署推理时,为了降低成本,往往使用单个 GPU 机器甚至嵌入式平台(比如 NVIDIA Jetson)进行部署,部署端也…...

spring mvc学习
第四章 Spring MVC 第一节 Spring MVC 简介 1. Spring MVC SpringMVC是一个Java 开源框架, 是Spring Framework生态中的一个独立模块,它基于 Spring 实现了Web MVC(数据、业务与展现)设计模式的请求驱动类型的轻量级Web框架&am…...
第4集《修习止观坐禅法要》
请打开讲义第七面,四、悟道。 我们前面讲到智者大师出家以后,他除了持戒以外,一方面拜忏,一方面就是打坐,来调伏他过去的烦恼跟罪业,以为他未来圆顿止观的一个基础,这以下讲到他开悟的情况&…...
IPython 日志的开关:精通 %logoff 命令的实用指南
IPython 日志的开关:精通 %logoff 命令的实用指南 在 IPython 的强大功能中,日志记录是一个不可或缺的工具,它帮助用户记录会话历史,以便日后分析和重现。%logoff 命令作为日志记录功能的补充,允许用户在需要时停止日…...

Redis 分布式集群方案 Cluster
引言 相比于Codis,Redis Cluster是Redis官方提供的解决方案。相比于Codis的不同,他是去中心化的,如图所示,该集群有三个Redis节点组成,每个节点负责整个集群的一部分数据,每个节点负责的数据多少可能不一样…...
Redis的两种持久化方案
Redis 提供了多种持久化机制来保证数据在发生意外情况下(如断电或服务器崩溃)不丢失。以下是几种主要的 Redis 持久化方案及其特点: 1. RDB (Redis Database Backup) RDB 是 Redis 创建的数据库快照,它可以将数据集快照以二进制…...
Spring中常见知识点及使用
Spring Framework 是 Java 生态系统中最流行的开源框架之一,它提供了一系列强大的功能,用于构建企业级应用。以下是一些常见的 Spring 知识点及其使用方法: 1. 依赖注入(Dependency Injection) 依赖注入是 Spring 的…...

Excel 宏录制与VBA编程 ——VBA编程技巧篇二 (合并内容相同连续单元格、取消合并单元格并在每个单元格中保留内容)
1、合并内容相同的连续单元格 如果需要合并如图所示的工作表中B列中部门相同的连续单元格 VBA代码: Sub Mergerng()Dim IntRow As IntegerDim i As IntegerApplication.DisplayAlerts FalseWith Sheet1IntRow .Range("A65536").End(xlUp).RowFor i In…...
理解和应用工业设备字典文件:一篇详细指南
理解和应用工业设备字典文件:一篇详细指南 在工业自动化领域,设备和模块的配置和管理是一个复杂而重要的任务。为了简化这个过程,字典文件被广泛应用于描述离线对象字典。本文将详细解释字典文件的用途、格式,并举例说明如何引用…...

Python酷库之旅-第三方库Pandas(010)
目录 一、用法精讲 22、pandas.read_hdf函数 22-1、语法 22-2、参数 22-3、功能 22-4、返回值 22-5、说明 22-6、用法 22-6-1、数据准备 22-6-2、代码示例 22-6-3、结果输出 23、pandas.HDFStore.put方法 23-1、语法 23-2、参数 23-3、功能 23-4、返回值 23-5…...
海康威视监控web实时预览解决方案
海康威视摄像头都试rtsp流,web页面无法加载播放,所以就得转换成web页面可以播放的hls、rtmp等数据流来播放。 一:萤石云 使用萤石云平台,把rtsp转化成ezopen协议,然后使用组件UIKit 最佳实践 萤石开放平台API文档 …...

ubuntu运行qq音乐闪退
ubuntu运行qq音乐闪退 修改/usr/share/applications中的qqmusic.desktop,在Exec后加上 --no-sandbox,如下图所示: 该文件有可能是只读,权限不够的话用sudo vim qqmusic.desktop...

人脸检测(Python)
目录 环境: 初始化摄像头: 初始化FaceDetector对象: 获取摄像头帧: 获取数据: 绘制数据: 显示图像: 完整代码: 环境: cvzone库:cvzone是一个基于…...

Offer150-23:链表中环的入口节点
题目描述:如果一个链表中包含环,找了环的入口节点。例如,在下图所示的链表中,环的入口节点是节点4。 分析:第一步需要确定一个链表中是否包含环,可以用快慢指针来解决这个问题。定义两个指针,同时从链表的头…...
【linux】服务器创建RAID1
【linux】服务器创建RAID1 文章目录 【linux】服务器创建RAID1一、配置介绍raid介绍raid类型RAID 0:RAID 1:RAID 5:RAID 6:二、配置RAID硬件RAID:软件RAID:三、软件配置RAID1(以linux为例)1.先进入管理员模式2.安装mdadm工具3.创建raid1数组4.查看RAID数组状态5.格式化和挂载…...

记录自己Ubuntu加Nvidia驱动从入门到入土的一天
前言 记录一下自己这波澜壮阔的一天,遇到了很多问题,解决了很多问题,但是还有很多问题,终于在晚上的零点彻底放弃,重启windows。 安装乌班图 1.安装虚拟机 我开始什么操作系统的基础都没有,网上随便搜了…...

基于现有Docker镜像构建新的Docker镜像
1.拉取ubuntu 22.04的系统镜像 docker pull ubuntu:22.04 拉取成功后在DockerDesktop中可发现该镜像 2.启动刚才接取的ubuntu镜像 docker run --name Ubuntu22.04 -it -d -p 22:22 -p 80:80 -p 443:443 340d9b015b194dc6e2a13938944e0d016e57b9679963fdeb9ce021daac430221 启…...

TDengine 快速体验(Docker 镜像方式)
简介 TDengine 可以通过安装包、Docker 镜像 及云服务快速体验 TDengine 的功能,本节首先介绍如何通过 Docker 快速体验 TDengine,然后介绍如何在 Docker 环境下体验 TDengine 的写入和查询功能。如果你不熟悉 Docker,请使用 安装包的方式快…...
React hook之useRef
React useRef 详解 useRef 是 React 提供的一个 Hook,用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途,下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...

Zustand 状态管理库:极简而强大的解决方案
Zustand 是一个轻量级、快速和可扩展的状态管理库,特别适合 React 应用。它以简洁的 API 和高效的性能解决了 Redux 等状态管理方案中的繁琐问题。 核心优势对比 基本使用指南 1. 创建 Store // store.js import create from zustandconst useStore create((set)…...

el-switch文字内置
el-switch文字内置 效果 vue <div style"color:#ffffff;font-size:14px;float:left;margin-bottom:5px;margin-right:5px;">自动加载</div> <el-switch v-model"value" active-color"#3E99FB" inactive-color"#DCDFE6"…...
AI编程--插件对比分析:CodeRider、GitHub Copilot及其他
AI编程插件对比分析:CodeRider、GitHub Copilot及其他 随着人工智能技术的快速发展,AI编程插件已成为提升开发者生产力的重要工具。CodeRider和GitHub Copilot作为市场上的领先者,分别以其独特的特性和生态系统吸引了大量开发者。本文将从功…...

Android15默认授权浮窗权限
我们经常有那种需求,客户需要定制的apk集成在ROM中,并且默认授予其【显示在其他应用的上层】权限,也就是我们常说的浮窗权限,那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...
大语言模型(LLM)中的KV缓存压缩与动态稀疏注意力机制设计
随着大语言模型(LLM)参数规模的增长,推理阶段的内存占用和计算复杂度成为核心挑战。传统注意力机制的计算复杂度随序列长度呈二次方增长,而KV缓存的内存消耗可能高达数十GB(例如Llama2-7B处理100K token时需50GB内存&a…...
管理学院权限管理系统开发总结
文章目录 🎓 管理学院权限管理系统开发总结 - 现代化Web应用实践之路📝 项目概述🏗️ 技术架构设计后端技术栈前端技术栈 💡 核心功能特性1. 用户管理模块2. 权限管理系统3. 统计报表功能4. 用户体验优化 🗄️ 数据库设…...

AirSim/Cosys-AirSim 游戏开发(四)外部固定位置监控相机
这个博客介绍了如何通过 settings.json 文件添加一个无人机外的 固定位置监控相机,因为在使用过程中发现 Airsim 对外部监控相机的描述模糊,而 Cosys-Airsim 在官方文档中没有提供外部监控相机设置,最后在源码示例中找到了,所以感…...

免费数学几何作图web平台
光锐软件免费数学工具,maths,数学制图,数学作图,几何作图,几何,AR开发,AR教育,增强现实,软件公司,XR,MR,VR,虚拟仿真,虚拟现实,混合现实,教育科技产品,职业模拟培训,高保真VR场景,结构互动课件,元宇宙http://xaglare.c…...