测试数据生成
集群在投入生产环境前需要一些数据来测试集群的稳定性、高可用性和吞吐量等等,由于现实环境中未必有这么大的数据,以及数据是否符合后期挖掘要求,这里根据需求生成一个可用于生成环境的测试数据集。
这里生成的数据集包含12亿条数据,大小为0.4T左右,基本符合测试要求。每条数据包含5个字段,地市 | 区县 | IMSI | 时间 | UUID,比如:
0571|57111|13676863|18/5/2 21:5|d80818b3f5a249fda7ab4c04582171b2
地市和区县编码如下:
编码 名称
57001 常山县
57002 开化县
57003 *市
57004 衢州市
57005 龙游县
57101 临安市
57102 余杭区
57103 富阳市
57104 建德市
57105 杭州市
57106 桐庐县
57107 淳安县
57108 萧山区
57109 西湖区
57110 江干区
57111 上城区
57112 下城区
57113 滨江区
57114 拱墅区
57115 下沙区
57201 安吉县
57202 市本级
57203 德清县
57204 长兴县
57205 吴兴区
57206 南浔区
57301 嘉兴市
57302 嘉善县
57303 平湖县
57304 桐乡县
57305 海宁县
57306 海盐县
57307 秀洲*
57308 南湖*
57401 余姚市
57402 北仑区
57403 奉化市
57404 宁波市
57405 宁海县
57406 慈溪市
57407 象山县
57408 鄞州区
57409 镇海区
57410 海曙*
57411 江北*
57412 江东*
57413 高新区*
57501 上虞市
57502 嵊州市
57503 新昌县
57504 绍兴市
57505 诸暨市
57506 柯桥
57601 三门县
57602 临海市
57603 仙居县
57604 天台县
57605 椒江区
57606 温岭市
57607 玉环县
57608 路桥区
57609 黄岩区
57701 乐清市
57702 平阳县
57703 文成县
57704 永嘉县
57705 泰顺县
57706 洞头县
57707 温州市
57708 瑞安市
57709 苍南县
57710 龙湾
57711 鹿城
57712 瓯海
57801 丽水市
57802 云和县
57803 庆元县
57804 景宁县
57805 松阳县
57806 缙云县
57807 遂昌县
57808 青田县
57809 龙泉市
57810 莲都
57811 南城
57901 东阳市
57902 义乌市
57903 兰溪市
57904 武义市
57905 永康市
57906 浦江市
57907 磐安市
57908 金华市
57909 婺城区
58001 岱山县
58002 嵊泗县
58003 普陀区
58004 舟山市
地市提取区县前三位,并增加0字段
IMSI号,从1到2千万之间取随机整数
时间暂定为1小时,取分钟,随机分布
这里开启100个线程并行生成数据,每个线程生成1200万条,具体代码如下:
import java.io.BufferedOutputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.Random;
import java.util.UUID;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
public class GenerateData {
private static String[] cities = {"0570", "0571", "0572", "0573", "0574", "0575",
"0576", "0577", "0578", "0579", "0580"};
private static String[][] zones = {
{"57001", "57002", "57003", "57004", "57005"},
{"57101", "57102", "57103", "57104", "57105",
"57106", "57107", "57108", "57109",
"57110", "57111", "57112", "57113",
"57114", "57115"},
{"57201", "57202", "57203", "57204", "57205", "57206"},
{"57301", "57302", "57303", "57304", "57305", "57306", "57307", "57308"},
{"57401", "57402", "57403", "57404", "57405", "57406", "57407", "57408",
"57409", "57410", "57411", "57412", "57413"},
{"57501", "57502", "57503", "57504", "57505", "57506"},
{"57601", "57602", "57603", "57604", "57605", "57606", "57607", "57608", "57609"},
{"57701", "57702", "57703", "57704", "57705", "57706", "57707", "57708", "57709",
"57710", "57711", "57712"},
{"57801", "57802", "57803", "57804", "57805", "57806", "57807", "57808", "57809",
"57810", "57811"},
{"57901", "57902", "57903", "57904", "57905", "57906", "57907", "57908", "57909"},
{"58001", "58002", "58003", "58004"}
};
private static Random random = new Random();
public static void main(String[] args) {
ExecutorService executor = Executors.newCachedThreadPool();
for (int i = 0; i < 100; i++)
executor.execute(new writeTask());
executor.shutdown();
}
static class writeTask implements Runnable {
@Override
public void run() {
for (int i = 0; i < 12000000; i++) {
writeData();
}
}
public void writeData() {
try (
ObjectOutputStream output = new ObjectOutputStream(
new BufferedOutputStream(new FileOutputStream("testdata.txt", true)));
) {
StringBuffer data = new StringBuffer();
int row = random.nextInt(11);
data.append(cities[row]).append("|");
switch (row) {
case 0 : data.append(zones[row][random.nextInt(5)]).append("|");
break;
case 1 : data.append(zones[row][random.nextInt(15)]).append("|");
break;
case 2 : data.append(zones[row][random.nextInt(6)]).append("|");
break;
case 3 : data.append(zones[row][random.nextInt(8)]).append("|");
break;
case 4 : data.append(zones[row][random.nextInt(13)]).append("|");
break;
case 5 : data.append(zones[row][random.nextInt(6)]).append("|");
break;
case 6 : data.append(zones[row][random.nextInt(9)]).append("|");
break;
case 7 : data.append(zones[row][random.nextInt(12)]).append("|");
break;
case 8 : data.append(zones[row][random.nextInt(11)]).append("|");
break;
case 9 : data.append(zones[row][random.nextInt(9)]).append("|");
break;
case 10 : data.append(zones[row][random.nextInt(4)]).append("|");
break;
}
data.append(random.nextInt(20000000) + 1).append("|");
Date date = generateRandomDate("2017-07-01", "2018-06-30");
Calendar calendar = Calendar.getInstance();
calendar.setTime(date);
data.append(calendar.get(Calendar.YEAR)).append("/").append(Calendar.MONTH).append("/").
append(calendar.get(Calendar.DATE)).append(" ").append(calendar.get(Calendar.HOUR)).
append(":").append(calendar.get(Calendar.MINUTE)).append("|");
String uuid = UUID.randomUUID().toString().replaceAll("-", "");
data.append(uuid).append("\r\n");
output.writeUTF(data.toString());
}
catch (IOException e) {
e.printStackTrace();
}
}
public Date generateRandomDate(String beginDate, String endDate) {
Date date = null;
try {
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
Date start = format.parse(beginDate); //构造开始日期
Date end = format.parse(endDate); //构造结束日期
if (start.getTime() > end.getTime()) {
return null;
}
date = new Date(randomDate(start.getTime(), end.getTime()));
}
catch (ParseException e) {
e.printStackTrace();
}
return date;
}
private long randomDate(long begin, long end) {
long rd = begin + (long)(Math.random() * (end - begin));
// 如果返回的是开始时间和结束时间,则递归调用本函数查找随机值
if(rd == begin || rd == end){
return randomDate(begin, end);
}
return rd;
}
}
}
上一篇: C#中判断一个数组中是否存在某个数组值
下一篇: js 测试数据