数据丰富:
数据丰富:
数据丰富:
1.11-1.17
原数据字段如下:
数据:
字符串:
session_id 用户访问的 sessionID
cookie_id 用户访问的 cookieID
visit_time 用户访问的时间
user_id 用户的 id
visit_url 用户访问的 URL
visit_os 用户访问的操作系统
browser_name 用户访问的游览器名称
visit_ip 用户访问的访问 ip
province 用户访问的省份
city 用户访问的城市
page_id 用户操作的页面 ID
goods_id 用户操作的商店 ID
shop_id 用户操作的商店 ID
flag_id 用户操作的标识(其中 0 表示浏览数据、1 表示购买数据、2 表示收藏数据、3 表示转发数据、4 表示评论数据)
对于数据字段的分析:
6e617d86-7471-4d00-b0d8-7aea47dc7c76,6e617d86-7471-4d00,2016-12-10 09:04:04,2bd50cbd-d9202,15,female,i.jsp,Unix,360,222.21.9.167,上海,上海,page_7,goods_87,shop_749,2
字段是以逗号做的分割,第一个的 sessionID,实际上是由 5 组16进制数组成,其中,第一组是 8 位,在 2、3、4 组都是 4 位,第五组是 12 位,位数上是 4 的倍数,符合我们计算机使用十六进制的目的
第二个的 cookie_id 是浏览器自带的,也是由 3 组16进制数组成。
第三个时间,表达的格式即为 YY-MM-DD hh:mm:ss
第四个用户id也是16进制数
其余类推
那么也就是说,16进制数所表示的意思并不能直接作为我们后续数据分析的内容,例:我们通过分析地区发现广东地区经常访问 A 商店,但此时16进制的内容如用户id只被用来区别访问的人,此外决定的数据是地区和商店
那么直接按该格式新建数据也是可以的,同时,16进制与10进制此时的区别仅作为区分不同的用户等,为了方便生产数据与表示,我们采取10进制数据做id标识。
所以我们可以在新建数据时,直接遵守同样的格式,修改我们所需要的数据项,如,同一个人在不同的商店里购买了不同的商品,但其用户id等均不需要发生变化。
所以我们将我们的操作从丰富原数据变成了新建1千万条数据。
因为新建用户需要随机的字段比要新建商品随机的字段要多的多,所以我们尽量以少新建用户,多新建商品为主
因为商品其实只是以数字为主,id也是以数字为主,那么直接开始随机也是可以的
因为数据量过大,变量一旦占用内存过多,会报出 OutOfMemoryError 错误,为了避免报错也为了让我们的项目进行下去。
所以我们删除了一些在后续数据分析并不会用到的字段,如 cookieId,该字段只是为了记录用户的操作日志,但这次项目中我们不需要用到。
同理,在后续我们需要用到的时候,可以在数据分析的相关程序里添加上我们所需要的相关功能。
新的字段如下:
visit_time 用户访问的时间
user_id 用户的id
browser_name 用户访问的浏览器名称
city 用户访问的城市
page_id 用户操作的页面ID
goods_id 用户操作的商店ID
shop_id 用户操作的商品ID
flag_id 用户操作的标识
有用的数据能够提供很多很多的信息,而无用的数据只会徒增工作量以及增加存储负担,因此,我们尽量精简掉字段。
因为数据量庞大,如果单纯的使用数组来存储,统一输出的话,一定会带来大量的内存占用,甚至可能会因为内存的问题。
导致无法达到想要的结果。
但是我们可以通过只使用一个单一变量,在每一次的循环里,我们就输出一次数据,然后将其存储进文件内。
单一的数据已经能够生成出来了。
其案例代码如下:
import java.util.Date;
import java.text.*;
import java.util.Random;
import java.lang.Math;
public class test {
public static void main(String args[]){
// 次数,该变量决定了创建的数据量多少
int count = 0;
// 开始循环
while (count < 2){
generate(count);
count++;
}
}
// 在这里面开始制造数据
static void generate(int count){
// 制造时间数据
// 初始化 Date 对象
Date date = new Date();
// 定义成用户需要的格式
SimpleDateFormat ft = new SimpleDateFormat ("yyyy-MM-dd hh:mm:ss");
// 赋值
String visit_time = ft.format(date);
// 输出
System.out.println("用户访问的时间为:" + visit_time);
// 制造 ID 数据
int user_id = count;
System.out.println("用户的id为:"+ user_id);
// 制造浏览器数据
double i = Math.random();
int num = (int)(i*5);
switch (num) {
case 0 :
System.out.println("用户的浏览器为:Chrome");
break;
case 1 :
System.out.println("用户的浏览器为:360");
break;
case 2 :
System.out.println("用户的浏览器为:IE");
break;
case 3 :
System.out.println("用户的浏览器为:Firefox");
break;
case 4 :
System.out.println("用户的浏览器为:Opera");
break;
case 5 :
System.out.println("用户的浏览器为:Safari");
break;
default :
System.out.println("出错了,请注意!");
}
// 制造城市数据
int city_num = (int)(i*)
String[] city = new String[
"河南省,郑州市","河南省,洛阳市","河南省,焦作市","河南省,商丘市","河南省,信阳市","河南省,周口市",
"河南省,鹤壁市","河南省,安阳市","河南省,濮阳市","河南省,驻马店市","河南省,南阳市","河南省,开封市",
"河南省,漯河市","河南省,许昌市","河南省,新乡市","河南省,济源市","河南省,灵宝市","河南省,偃师市",
"河南省,邓州市","河南省,登封市","河南省,三门峡市","河南省,新郑市","河南省,禹州市","河南省,巩义市",
"河南省,永城市","河南省,长葛市","河南省,义马市","河南省,林州市","河南省,项城市","河南省,汝州市",
"河南省,荥阳市","河南省,平顶山市","河南省,卫辉市","河南省,辉县市","河南省,舞钢市","河南省,新密市",
"河南省,孟州市","河南省,沁阳市","河南省,郏县"
];
// 制造操作页面ID、商品ID以及商店ID数据
String page_id = "page_" + count;
System.out.println("用户操作的页面ID为:" + page_id);
String goods_id = "goods_" + count;
System.out.println("用户操作的商品ID为:" + goods_id);
String shop_id = "shop_" + count;
System.out.println("用户操作的商店ID为:" + shop_id);
// 制造用户操作的标识数据
int flag_id = (int)(i*4);
System.out.println("用户操作的标识为:" + flag_id);
}
}
628561 是最终的用户id数最大值,可能是int最大值,我们换成long试一下
接下来是本次项目的重头戏,丰富后的数据,代码案例如下:
import java.util.Date;
import java.text.*;
import java.util.Random;
import java.lang.Math;
public class test {
public static void main(String args[]){
// 次数,该变量决定了创建的数据量多少
long count = 0;
// 开始循环
/*
while (count < 10000000){
double i = Math.random();
int num_random_count = (int)(i*100);
generate(count,num_random_count);
count++;
}
*/
///*
while (count < 2){
System.out.println("下一个用户的个人数据:");
double i = Math.random();
int num_random_count = (int)(i*5);
//int num_random_count = (int)(i*100);
System.out.println("这位用户创造了" + num_random_count + "条不同的数据");
generate(count,num_random_count);
System.out.println("");
count++;
}
//*/
}
// 在这里面开始制造数据
static void generate(long count,int num_random_count){
if (num_random_count == 0){
num_random_count = 1;
}
do{
// 制造 ID 数据
long user_id = count;
// 制造浏览器数据
double browser_num_random = Math.random();
int browser_num = (int)(browser_num_random*5);
// 制造城市数据
double city_num_random = Math.random();
int city_num = (int)(city_num_random*39);
String[] city_char = {
"河南省,郑州市","河南省,洛阳市","河南省,焦作市","河南省,商丘市","河南省,信阳市","河南省,周口市",
"河南省,鹤壁市","河南省,安阳市","河南省,濮阳市","河南省,驻马店市","河南省,南阳市","河南省,开封市",
"河南省,漯河市","河南省,许昌市","河南省,新乡市","河南省,济源市","河南省,灵宝市","河南省,偃师市",
"河南省,邓州市","河南省,登封市","河南省,三门峡市","河南省,新郑市","河南省,禹州市","河南省,巩义市",
"河南省,永城市","河南省,长葛市","河南省,义马市","河南省,林州市","河南省,项城市","河南省,汝州市",
"河南省,荥阳市","河南省,平顶山市","河南省,卫辉市","河南省,辉县市","河南省,舞钢市","河南省,新密市",
"河南省,孟州市","河南省,沁阳市","河南省,郏县"
};
String city = city_char[city_num];
for (;num_random_count > 0;num_random_count--){
System.out.println("用户的id为:"+ user_id);
System.out.println("用户访问的城市为:" + city);
switch (browser_num) {
case 0 :
System.out.println("用户的浏览器为:Chrome");
break;
case 1 :
System.out.println("用户的浏览器为:360");
break;
case 2 :
System.out.println("用户的浏览器为:IE");
break;
case 3 :
System.out.println("用户的浏览器为:Firefox");
break;
case 4 :
System.out.println("用户的浏览器为:Opera");
break;
case 5 :
System.out.println("用户的浏览器为:Safari");
break;
default :
System.out.println("出错了,请注意!");
}
// 制造时间数据
// 初始化 Date 对象
Date date = new Date();
// 定义成用户需要的格式
SimpleDateFormat ft = new SimpleDateFormat ("yyyy-MM-dd HH:MM:SS");
// 赋值
String year = "2020";
double month_num_random = Math.random();
int month = ((int)(month_num_random*11)) + 1;
double day_num_random = Math.random();
int day = ((int)(day_num_random*29)) + 1;
double hour_num_random = Math.random();
int hour = (int)(hour_num_random*23);
double min_num_random = Math.random();
int min = (int)(min_num_random*59);
double second_num_random = Math.random();
int second = (int)(second_num_random*59);
String visit_time = year + "-" + month + "-" + day + " " + hour + ":" + min + ":" + second;
// 输出
System.out.println("用户访问的时间为:" + visit_time);
// 制造操作页面ID、商品ID以及商店ID数据
double page_id_num_random = Math.random();
int page_id_int = (int)(page_id_num_random*99);
String page_id = "page_" + page_id_int;
System.out.println("用户操作的页面ID为:" + page_id);
double goods_id_num_random = Math.random();
int goods_id_int = (int)(goods_id_num_random*99);
String goods_id = "goods_" + goods_id_int;
System.out.println("用户操作的商品ID为:" + goods_id);
double shop_id_num_random = Math.random();
int shop_id_int = (int)(shop_id_num_random*99);
String shop_id = "shop_" + shop_id_int;
System.out.println("用户操作的商店ID为:" + shop_id);
// 制造用户操作的标识数据
double flag_id_num_random = Math.random();
int flag_id = (int)(flag_id_num_random*4);
System.out.println("用户操作的标识为:" + flag_id);
}
} while(false);
}
}
参考文献: https://zhidao.baidu.com/question/327882154429814525.html
[https://baike.baidu.com/item/IP%E5%9C%B0%E5%9D%80/150859](https://baike.baidu.com/item/IP%E5%9C%B0%E5%9D%80/150859)
[https://blog.csdn.net/lihaitao000/article/details/51159562](https://blog.csdn.net/lihaitao000/article/details/51159562)
[https://www.cnblogs.com/skywang12345/p/3341423.html](https://www.cnblogs.com/skywang12345/p/3341423.html)
[https://baike.baidu.com/item/%E7%9C%81%E4%BB%BD/1635191?fr=aladdin](https://baike.baidu.com/item/%E7%9C%81%E4%BB%BD/1635191?fr=aladdin)
[https://mp.weixin.qq.com/s/T1N6N_8UdXVgrUorsPCMpQ](https://mp.weixin.qq.com/s/T1N6N_8UdXVgrUorsPCMpQ)
[https://www.runoob.com/java/java-date-time.html](https://www.runoob.com/java/java-date-time.html)
[https://www.runoob.com/java/java-switch-case.html](https://www.runoob.com/java/java-switch-case.html)
[https://www.runoob.com/python3/python3-tuple.html](https://www.runoob.com/python3/python3-tuple.html)
[https://www.runoob.com/java/java-loop.html](https://www.runoob.com/java/java-loop.html)
[https://www.cnblogs.com/My-Cloud/p/4546317.html](https://www.cnblogs.com/My-Cloud/p/4546317.html)