利用符集編碼。
創(chuàng)新互聯(lián)建站2013年開(kāi)創(chuàng)至今,是專(zhuān)業(yè)互聯(lián)網(wǎng)技術(shù)服務(wù)公司,擁有項(xiàng)目成都網(wǎng)站設(shè)計(jì)、網(wǎng)站制作網(wǎng)站策劃,項(xiàng)目實(shí)施與項(xiàng)目整合能力。我們以讓每一個(gè)夢(mèng)想脫穎而出為使命,1280元安龍做網(wǎng)站,已為上家服務(wù),為安龍各地企業(yè)和個(gè)人服務(wù),聯(lián)系電話:13518219792
因?yàn)镠DFS支持6種字符集編碼,每個(gè)本地文件編碼方式又是極可能不一樣的,我們上傳本地文件的時(shí)候其實(shí)就是把文件編碼成字節(jié)流上傳到文件系統(tǒng)存儲(chǔ)。
,代碼主要邏輯如下:
// 讀取要導(dǎo)入數(shù)據(jù)的文件
BufferedReader br = new BufferedReader(new FileReader(
"D:\\test\\test.txt"));
String json = null;
int count = 0;
// 開(kāi)啟批量插入
BulkRequestBuilder bulkRequest = client.prepareBulk();
while ((json = br.readLine()) != null) {
bulkRequest.add(client.prepareIndex("test", "all")
.setSource(json));
// 每一千條提交一次
if (count % 1000 == 0) {
bulkRequest.execute().actionGet();
System.out.println("提交了:" + count);
}
count++;
}
bulkRequest.execute().actionGet();
System.out.println("插入完畢");
br.close();
登錄后復(fù)制
?
運(yùn)行后發(fā)現(xiàn)一個(gè)問(wèn)題,我100多萬(wàn)條的數(shù)據(jù),導(dǎo)入到es中怎么生成了1000多萬(wàn)條,而且還是在沒(méi)有完全導(dǎo)入的情況下
然后用小批量數(shù)據(jù)導(dǎo)入到es,再把這些數(shù)據(jù)導(dǎo)出來(lái),發(fā)現(xiàn)有好多重復(fù)的數(shù)據(jù)
為什么會(huì)重復(fù)呢,原因是在每一千條提交一次代碼這塊,第一次一千條提交了,并沒(méi)有把bulkRequest置空,所以第二次提交的時(shí)候,會(huì)提交兩千條,包括第一次已經(jīng)提交的一千條,然后我們自己也沒(méi)有設(shè)置_id,所以es會(huì)自動(dòng)給數(shù)據(jù)生成一個(gè)_id,即使是重復(fù)的數(shù)據(jù),搞清楚了原因,下面來(lái)說(shuō)解決方法,主要有兩種:
第一種就是在提交了一千條后,對(duì)bulkRequest進(jìn)行重置,因?yàn)閎ulkRequest并沒(méi)有重置的方法,所以可以新建一個(gè)bulkRequest,類(lèi)似于重置,具體代碼如下:
// 讀取要導(dǎo)入數(shù)據(jù)的文件
BufferedReader br = new BufferedReader(new FileReader(
"D:\\test\\test.txt"));
String json = null;
int count = 0;
// 開(kāi)啟批量插入
BulkRequestBuilder bulkRequest = client.prepareBulk();
while ((json = br.readLine()) != null) {
bulkRequest.add(client.prepareIndex("test", "all")
.setSource(json));
// 每一千條提交一次
if (count % 1000 == 0) {
bulkRequest.execute().actionGet();
//此處新建一個(gè)bulkRequest,類(lèi)似于重置效果
bulkRequest = client.prepareBulk();
System.out.println("提交了:" + count);
}
count++;
}
bulkRequest.execute().actionGet();
System.out.println("插入完畢");
br.close();
登錄后復(fù)制
?
第二種就是自己設(shè)置_id,確保每一條數(shù)據(jù)只有一個(gè)_id,這樣的話,即使數(shù)據(jù)重復(fù)了,因?yàn)開(kāi)id是一樣的,所以es會(huì)進(jìn)行更新,這樣的話并沒(méi)有從根源上解決數(shù)據(jù)重復(fù)的問(wèn)題,只是重復(fù)數(shù)據(jù)會(huì)更新,這樣的話效率會(huì)慢,具體代碼如下:
// 讀取要導(dǎo)入數(shù)據(jù)的文件
BufferedReader br = new BufferedReader(new FileReader(
"D:\\test\\test.txt"));
String json = null;
int count = 0;
// 開(kāi)啟批量插入
BulkRequestBuilder bulkRequest = client.prepareBulk();
while ((json = br.readLine()) != null) {
//設(shè)置_id為count
bulkRequest.add(client.prepareIndex("test", "all",
String.valueOf(count)).setSource(json));
// 每一千條提交一次
if (count % 1000 == 0) {
bulkRequest.execute().actionGet();
//此處新建一個(gè)bulkRequest,類(lèi)似于重置效果
System.out.println("提交了:" + count);
}
count++;
}
bulkRequest.execute().actionGet();
System.out.println("插入完畢");
br.close();
登錄后復(fù)制
?
建議使用第一種方法,效率會(huì)快很多。
原因是你編譯使用的javac,把代碼編譯成版本61的class,而你的運(yùn)行環(huán)境java,是一個(gè)老版本,能執(zhí)行的上限是52版本。
解決方法有兩個(gè):
1,安裝和JDK相同版本的Java運(yùn)行時(shí)(JRE),并正確設(shè)置PATH變量。驗(yàn)證方法是:
在黑窗口里分別輸入java -version和javac -version,兩個(gè)版本要一致,或者java的版本更高。
相關(guān)命令截圖如下:
2,編譯的時(shí)候指定運(yùn)行時(shí)的版本:使用--release參數(shù)指定版本。
例如,你通過(guò) java -version查看到版本=8,那么就按如圖的命令編譯
這4個(gè)構(gòu)造函數(shù)分別是對(duì)1個(gè),2個(gè),3個(gè),以及4個(gè)參數(shù)的處理,最好別刪,如果非要?jiǎng)h掉一些代碼的話,建議刪掉前面3個(gè)構(gòu)造函數(shù),保留最后的有4個(gè)參數(shù)那個(gè),當(dāng)然最后那個(gè)也要修改
代碼:
person(String?name,int?age,int?weight,String?address){
this.name?=?name;
this.age?=?age;
this.weight?=?weight;
this.address?=?address;
}
(PS:純手打,望采納)