热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

irms模拟数据生成及数据分析

一、数据准备1、每天生成随机一个文本,每小时向文本中追加2次数据,每次10万条随机数据生成:2,32****bashmntjediaelirmssignalGenerator



一、数据准备
1、每天生成随机一个文本,每小时向文本中追加2次数据,每次10万条
随机数据生成:
2,32  * * * *  bash /mnt/jediael/irms/signalGenerator/signalGenerator.sh >> /home/jediael/sg.log 2>&1
类:SignalGenerator

2、每天将前一天生成的数据文本导入HDFS
32 0 * * * bash /mnt/jediael/irms/signalGenerator/copySignalToHdfs.sh >>/home/jediael/sg.log 2>&1


二、数据分析
1、每天执行一次数据分析,将结果输出到hdfs文本中。
42 0 * * * bash /mnt/jediael/irms/signalparser/signalParser.sh >>/home/jediael/sg.log 2>&1
类:SignalParser

程序文件:

/mnt/jediael/irms/signalGenerator/signalGenerator.sh

#!/bin/bash
export JAVA_HOME=/usr/java/jdk1.7.0_51
export PATH=$JAVA_HOME/bin:$PATH
export CLASSPATH=$CLASSPATH:/mnt/jediael/irms/signalGenerator/
java SignalGenerator

/mnt/jediael/irms/signalGenerator/copySignalToHdfs.sh

#!/bin/bash
export JAVA_HOME=/usr/java/jdk1.7.0_51
PATH=/mnt/jediael/hadoop-1.2.1/bin/:/mnt/jediael/hbase-0.94.26/bin:/mnt/jediael/tomcat-7.0.54/bin:$JAVA_HOME/bin:$PATH
hadoop fs -copyFromLocal /mnt/jediael/irms/signalGenerator/`date -d "-1 day" +%Y%m%d`.txt /irms/signal >> sg.log

/mnt/jediael/irms/signalparser/signalParser.sh

#!/bin/bash

export JAVA_HOME=/usr/java/jdk1.7.0_51
PATH=/mnt/jediael/hadoop-1.2.1/bin/:/mnt/jediael/hbase-0.94.26/bin:/mnt/jediael/tomcat-7.0.54/bin:$JAVA_HOME/bin:$PATH
hadoop jar signalgenerator.jar /irms/signal/`date -d "-1 day" +%Y%m%d`.txt /irms/result/`date -d "-1 day" +%Y%m%d`


SignalGenerator.java

package com.gmcc.irms.util;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.text.SimpleDateFormat;
import java.util.Random;

//此类用于模拟生成信令数据,每次生成100000条

public class SignalGenerator {
// 业务类型,如呼入、呼出、发短信、收短信、上网、WLAN等
private int activeType = 0;

private String getNextSign() {
String sign = "";
Random rand = new Random();
activeType = rand.nextInt(6);
// 主叫号码
String callNum = "1390222" + rand.nextInt(9) + rand.nextInt(9)
+ rand.nextInt(9) + rand.nextInt(9);
// 被叫号码
String beCallNum = "1390222" + rand.nextInt(9) + rand.nextInt(9)
+ rand.nextInt(9) + rand.nextInt(9);
// 时长、或者是流量
String callDuration = "";
for (int i = 0; i <16; i++) {
callDuration += rand.nextInt(9);
}
sign = activeType + callNum + beCallNum + callDuration;
for (int i = 0; i <800; i++) {
sign += rand.nextInt(9);
}
return sign;

}

public static void main(String[] args) throws IOException {

SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");
long time = System.currentTimeMillis();
String fileName = sdf.format(time) + ".txt";
OutputStream os = new FileOutputStream(fileName, true);
SignalGenerator sg = new SignalGenerator();
String newline = System.getProperty("line.separator");

for (int i = 0; i <100000; i++) {
os.write((sg.getNextSign() + newline).getBytes());

}
os.flush();
os.close();

}

}




SignalParser.java

package com.gmcc.irms.signal;

import java.io.IOException;

import org.apache.hadoop.fs.Path;
import org.apache.hadoop.io.LongWritable;
import org.apache.hadoop.io.Text;
import org.apache.hadoop.mapreduce.Job;
import org.apache.hadoop.mapreduce.Mapper;
import org.apache.hadoop.mapreduce.Reducer;
import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;

public class SignalParser {
public static void main(String[] args) throws Exception {

Job job = new Job();
job.setJarByClass(SignalParser.class);
job.setJobName("signal parser");
FileInputFormat.addInputPath(job, new Path(args[0]));
FileOutputFormat.setOutputPath(job, new Path(args[1]));
job.setMapperClass(SignalParserMapper.class);
job.setReducerClass(SignalParserReducer.class);
job.setOutputKeyClass(Text.class);
job.setOutputValueClass(Text.class);
System.exit(job.waitForCompletion(true) ? 0 : 1);
}
}

class SignalParserMapper extends Mapper {

@Override
public void map(LongWritable key, Text value, Context context)
throws IOException, InterruptedException {
String line = value.toString();
// 业务类型
String activeType = line.substring(0, 1);
// 主叫电话号码
String customer = line.substring(1, 12);
// 通话时长、web时长、wlan时长
int duration = Integer.parseInt(line.substring(23, 30));

context.write(new Text(customer),new Text(activeType + "," + duration));

}
}

class SignalParserReducer extends Reducer {
@Override
public void reduce(Text key, Iterable values, Context context)
throws IOException, InterruptedException {
//总通话时长
int sumCallDuration = 0;
//通话次数
int callTimes = 0;
//发送短信次数
int smsTimes = 0;
//上网总时长
int sumWebDuration = 0;
//上网次数
int webTimes = 0;
//WLAN总时长
int sumWlanDuration = 0;
//WLAN次数
int wlanTimes = 0;

String[] valueArray = null;
int activeType = -1;
int duration = -1;
for (Text value:values){

valueArray = value.toString().split(",");
System.out.println(valueArray[0]+" a "+valueArray[1]);
activeType = Integer.parseInt(valueArray[0]);
duration = Integer.parseInt(valueArray[1]);
if(activeType == 0){
//呼出
sumCallDuration += duration;
callTimes++;
}else if(activeType == 2){
//发sms
smsTimes++;
}else if(activeType == 4){
//上网
sumWebDuration += duration;
webTimes ++;
}else if(activeType == 5){
//WLAN
sumWlanDuration += duration;
wlanTimes ++;
}else{

}
}


context.write(key, new Text(sumCallDuration + "\t" + callTimes + "\t" +smsTimes+"\t" + sumWebDuration+"\t" + webTimes+"\t" + sumWebDuration+"\t" + webTimes));
}
}




推荐阅读
  • 本文介绍了解决Netty拆包粘包问题的一种方法——使用特殊结束符。在通讯过程中,客户端和服务器协商定义一个特殊的分隔符号,只要没有发送分隔符号,就代表一条数据没有结束。文章还提供了服务端的示例代码。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 本文介绍了在处理不规则数据时如何使用Python自动提取文本中的时间日期,包括使用dateutil.parser模块统一日期字符串格式和使用datefinder模块提取日期。同时,还介绍了一段使用正则表达式的代码,可以支持中文日期和一些特殊的时间识别,例如'2012年12月12日'、'3小时前'、'在2012/12/13哈哈'等。 ... [详细]
  • 本文介绍了Swing组件的用法,重点讲解了图标接口的定义和创建方法。图标接口用来将图标与各种组件相关联,可以是简单的绘画或使用磁盘上的GIF格式图像。文章详细介绍了图标接口的属性和绘制方法,并给出了一个菱形图标的实现示例。该示例可以配置图标的尺寸、颜色和填充状态。 ... [详细]
  • 超级简单加解密工具的方案和功能
    本文介绍了一个超级简单的加解密工具的方案和功能。该工具可以读取文件头,并根据特定长度进行加密,加密后将加密部分写入源文件。同时,该工具也支持解密操作。加密和解密过程是可逆的。本文还提到了一些相关的功能和使用方法,并给出了Python代码示例。 ... [详细]
  • java drools5_Java Drools5.1 规则流基础【示例】(中)
    五、规则文件及规则流EduInfoRule.drl:packagemyrules;importsample.Employ;ruleBachelorruleflow-group ... [详细]
  • 本文介绍了在sqoop1.4.*版本中,如何实现自定义分隔符的方法及步骤。通过修改sqoop生成的java文件,并重新编译,可以满足实际开发中对分隔符的需求。具体步骤包括修改java文件中的一行代码,重新编译所需的hadoop包等。详细步骤和编译方法在本文中都有详细说明。 ... [详细]
  • 使用freemaker生成Java代码的步骤及示例代码
    本文介绍了使用freemaker这个jar包生成Java代码的步骤,通过提前编辑好的模板,可以避免写重复代码。首先需要在springboot的pom.xml文件中加入freemaker的依赖包。然后编写模板,定义要生成的Java类的属性和方法。最后编写生成代码的类,通过加载模板文件和数据模型,生成Java代码文件。本文提供了示例代码,并展示了文件目录结构。 ... [详细]
  • 如何优化Webpack打包后的代码分割
    本文介绍了如何通过优化Webpack的代码分割来减小打包后的文件大小。主要包括拆分业务逻辑代码和引入第三方包的代码、配置Webpack插件、异步代码的处理、代码分割重命名、配置vendors和cacheGroups等方面的内容。通过合理配置和优化,可以有效减小打包后的文件大小,提高应用的加载速度。 ... [详细]
  • maven项目_idea导入本地maven项目
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了idea导入本地maven项目相关的知识,希望对你有一定的参考价值。首先把项目关闭Fil ... [详细]
  • mapreduce源码分析总结
    这篇文章总结的非常到位,故而转之一MapReduce概述MapReduce是一个用于大规模数据处理的分布式计算模型,它最初是由Google工程师设计并实现的ÿ ... [详细]
  • 本文整理了Java中org.apache.hadoop.hbase.client.Increment.getDurability()方法的一些代码示例,展示了 ... [详细]
  • 如何实现JDK版本的切换功能,解决开发环境冲突问题
    本文介绍了在开发过程中遇到JDK版本冲突的情况,以及如何通过修改环境变量实现JDK版本的切换功能,解决开发环境冲突的问题。通过合理的切换环境,可以更好地进行项目开发。同时,提醒读者注意不仅限于1.7和1.8版本的转换,还要适应不同项目和个人开发习惯的需求。 ... [详细]
  • JAVA调用存储过程CallableStatement对象的方法及使用示例
    本文介绍了使用JAVA调用存储过程CallableStatement对象的方法,包括创建CallableStatement对象、传入IN参数、注册OUT参数、传入INOUT参数、检索结果和OUT参数、处理NULL值等。通过示例代码演示了具体的调用过程。 ... [详细]
  • 在本教程中,我们将看到如何使用FLASK制作第一个用于机器学习模型的RESTAPI。我们将从创建机器学习模型开始。然后,我们将看到使用Flask创建AP ... [详细]
author-avatar
漫天星雨2000
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有