數(shù)據(jù)豐富:
數(shù)據(jù)豐富:
數(shù)據(jù)豐富:


1.11-1.17
原數(shù)據(jù)字段如下:
數(shù)據(jù):
字符串:
session_id 用戶訪問的 sessionID
cookie_id 用戶訪問的 cookieID
visit_time 用戶訪問的時(shí)間
user_id 用戶的 id
visit_url 用戶訪問的 URL
visit_os 用戶訪問的操作系統(tǒng)
browser_name 用戶訪問的游覽器名稱
visit_ip 用戶訪問的訪問 ip
province 用戶訪問的省份
city 用戶訪問的城市
page_id 用戶操作的頁面 ID
goods_id 用戶操作的商店 ID
shop_id 用戶操作的商店 ID
flag_id 用戶操作的標(biāo)識(其中 0 表示瀏覽數(shù)據(jù)、1 表示購買數(shù)據(jù)、2 表示收藏?cái)?shù)據(jù)、3 表示轉(zhuǎn)發(fā)數(shù)據(jù)、4 表示評論數(shù)據(jù))
對于數(shù)據(jù)字段的分析:
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
字段是以逗號做的分割,第一個(gè)的 sessionID,實(shí)際上是由 5 組16進(jìn)制數(shù)組成,其中,第一組是 8 位,在 2、3、4 組都是 4 位,第五組是 12 位,位數(shù)上是 4 的倍數(shù),符合我們計(jì)算機(jī)使用十六進(jìn)制的目的
第二個(gè)的 cookie_id 是瀏覽器自帶的,也是由 3 組16進(jìn)制數(shù)組成。
第三個(gè)時(shí)間,表達(dá)的格式即為 YY-MM-DD hh:mm:ss
第四個(gè)用戶id也是16進(jìn)制數(shù)
其余類推
那么也就是說,16進(jìn)制數(shù)所表示的意思并不能直接作為我們后續(xù)數(shù)據(jù)分析的內(nèi)容,例:我們通過分析地區(qū)發(fā)現(xiàn)廣東地區(qū)經(jīng)常訪問 A 商店,但此時(shí)16進(jìn)制的內(nèi)容如用戶id只被用來區(qū)別訪問的人,此外決定的數(shù)據(jù)是地區(qū)和商店
那么直接按該格式新建數(shù)據(jù)也是可以的,同時(shí),16進(jìn)制與10進(jìn)制此時(shí)的區(qū)別僅作為區(qū)分不同的用戶等,為了方便生產(chǎn)數(shù)據(jù)與表示,我們采取10進(jìn)制數(shù)據(jù)做id標(biāo)識。
所以我們可以在新建數(shù)據(jù)時(shí),直接遵守同樣的格式,修改我們所需要的數(shù)據(jù)項(xiàng),如,同一個(gè)人在不同的商店里購買了不同的商品,但其用戶id等均不需要發(fā)生變化。
所以我們將我們的操作從豐富原數(shù)據(jù)變成了新建1千萬條數(shù)據(jù)。
因?yàn)樾陆ㄓ脩粜枰S機(jī)的字段比要新建商品隨機(jī)的字段要多的多,所以我們盡量以少新建用戶,多新建商品為主
因?yàn)樯唐菲鋵?shí)只是以數(shù)字為主,id也是以數(shù)字為主,那么直接開始隨機(jī)也是可以的
因?yàn)閿?shù)據(jù)量過大,變量一旦占用內(nèi)存過多,會(huì)報(bào)出 OutOfMemoryError 錯(cuò)誤,為了避免報(bào)錯(cuò)也為了讓我們的項(xiàng)目進(jìn)行下去。
所以我們刪除了一些在后續(xù)數(shù)據(jù)分析并不會(huì)用到的字段,如 cookieId,該字段只是為了記錄用戶的操作日志,但這次項(xiàng)目中我們不需要用到。
同理,在后續(xù)我們需要用到的時(shí)候,可以在數(shù)據(jù)分析的相關(guān)程序里添加上我們所需要的相關(guān)功能。
新的字段如下:
visit_time 用戶訪問的時(shí)間
user_id 用戶的id
browser_name 用戶訪問的瀏覽器名稱
city 用戶訪問的城市
page_id 用戶操作的頁面ID
goods_id 用戶操作的商店ID
shop_id 用戶操作的商品ID
flag_id 用戶操作的標(biāo)識
有用的數(shù)據(jù)能夠提供很多很多的信息,而無用的數(shù)據(jù)只會(huì)徒增工作量以及增加存儲負(fù)擔(dān),因此,我們盡量精簡掉字段。
因?yàn)閿?shù)據(jù)量龐大,如果單純的使用數(shù)組來存儲,統(tǒng)一輸出的話,一定會(huì)帶來大量的內(nèi)存占用,甚至可能會(huì)因?yàn)閮?nèi)存的問題。
導(dǎo)致無法達(dá)到想要的結(jié)果。
但是我們可以通過只使用一個(gè)單一變量,在每一次的循環(huán)里,我們就輸出一次數(shù)據(jù),然后將其存儲進(jìn)文件內(nèi)。
單一的數(shù)據(jù)已經(jīng)能夠生成出來了。
其案例代碼如下:
import java.util.Date;
import java.text.*;
import java.util.Random;
import java.lang.Math;
public class test {
public static void main(String args[]){
// 次數(shù),該變量決定了創(chuàng)建的數(shù)據(jù)量多少
int count = 0;
// 開始循環(huán)
while (count < 2){
generate(count);
count++;
}
}
// 在這里面開始制造數(shù)據(jù)
static void generate(int count){
// 制造時(shí)間數(shù)據(jù)
// 初始化 Date 對象
Date date = new Date();
// 定義成用戶需要的格式
SimpleDateFormat ft = new SimpleDateFormat ("yyyy-MM-dd hh:mm:ss");
// 賦值
String visit_time = ft.format(date);
// 輸出
System.out.println("用戶訪問的時(shí)間為:" + visit_time);
// 制造 ID 數(shù)據(jù)
int user_id = count;
System.out.println("用戶的id為:"+ user_id);
// 制造瀏覽器數(shù)據(jù)
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("出錯(cuò)了,請注意!");
}
// 制造城市數(shù)據(jù)
int city_num = (int)(i*)
String[] city = new String[
"河南省,鄭州市","河南省,洛陽市","河南省,焦作市","河南省,商丘市","河南省,信陽市","河南省,周口市",
"河南省,鶴壁市","河南省,安陽市","河南省,濮陽市","河南省,駐馬店市","河南省,南陽市","河南省,開封市",
"河南省,漯河市","河南省,許昌市","河南省,新鄉(xiāng)市","河南省,濟(jì)源市","河南省,靈寶市","河南省,偃師市",
"河南省,鄧州市","河南省,登封市","河南省,三門峽市","河南省,新鄭市","河南省,禹州市","河南省,鞏義市",
"河南省,永城市","河南省,長葛市","河南省,義馬市","河南省,林州市","河南省,項(xiàng)城市","河南省,汝州市",
"河南省,滎陽市","河南省,平頂山市","河南省,衛(wèi)輝市","河南省,輝縣市","河南省,舞鋼市","河南省,新密市",
"河南省,孟州市","河南省,沁陽市","河南省,郟縣"
];
// 制造操作頁面ID、商品ID以及商店ID數(shù)據(jù)
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);
// 制造用戶操作的標(biāo)識數(shù)據(jù)
int flag_id = (int)(i*4);
System.out.println("用戶操作的標(biāo)識為:" + flag_id);
}
}
628561 是最終的用戶id數(shù)最大值,可能是int最大值,我們換成long試一下
接下來是本次項(xiàng)目的重頭戲,豐富后的數(shù)據(jù),代碼案例如下:
import java.util.Date;
import java.text.*;
import java.util.Random;
import java.lang.Math;
public class test {
public static void main(String args[]){
// 次數(shù),該變量決定了創(chuàng)建的數(shù)據(jù)量多少
long count = 0;
// 開始循環(huán)
/*
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("下一個(gè)用戶的個(gè)人數(shù)據(jù):");
double i = Math.random();
int num_random_count = (int)(i*5);
//int num_random_count = (int)(i*100);
System.out.println("這位用戶創(chuàng)造了" + num_random_count + "條不同的數(shù)據(jù)");
generate(count,num_random_count);
System.out.println("");
count++;
}
//*/
}
// 在這里面開始制造數(shù)據(jù)
static void generate(long count,int num_random_count){
if (num_random_count == 0){
num_random_count = 1;
}
do{
// 制造 ID 數(shù)據(jù)
long user_id = count;
// 制造瀏覽器數(shù)據(jù)
double browser_num_random = Math.random();
int browser_num = (int)(browser_num_random*5);
// 制造城市數(shù)據(jù)
double city_num_random = Math.random();
int city_num = (int)(city_num_random*39);
String[] city_char = {
"河南省,鄭州市","河南省,洛陽市","河南省,焦作市","河南省,商丘市","河南省,信陽市","河南省,周口市",
"河南省,鶴壁市","河南省,安陽市","河南省,濮陽市","河南省,駐馬店市","河南省,南陽市","河南省,開封市",
"河南省,漯河市","河南省,許昌市","河南省,新鄉(xiāng)市","河南省,濟(jì)源市","河南省,靈寶市","河南省,偃師市",
"河南省,鄧州市","河南省,登封市","河南省,三門峽市","河南省,新鄭市","河南省,禹州市","河南省,鞏義市",
"河南省,永城市","河南省,長葛市","河南省,義馬市","河南省,林州市","河南省,項(xiàng)城市","河南省,汝州市",
"河南省,滎陽市","河南省,平頂山市","河南省,衛(wèi)輝市","河南省,輝縣市","河南省,舞鋼市","河南省,新密市",
"河南省,孟州市","河南省,沁陽市","河南省,郟縣"
};
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("出錯(cuò)了,請注意!");
}
// 制造時(shí)間數(shù)據(jù)
// 初始化 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("用戶訪問的時(shí)間為:" + visit_time);
// 制造操作頁面ID、商品ID以及商店ID數(shù)據(jù)
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);
// 制造用戶操作的標(biāo)識數(shù)據(jù)
double flag_id_num_random = Math.random();
int flag_id = (int)(flag_id_num_random*4);
System.out.println("用戶操作的標(biāo)識為:" + flag_id);
}
} while(false);
}
}

參考文獻(xiàn): 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)