利用符集編碼。
創新互聯建站2013年開創至今,是專業互聯網技術服務公司,擁有項目成都網站設計、網站制作網站策劃,項目實施與項目整合能力。我們以讓每一個夢想脫穎而出為使命,1280元安龍做網站,已為上家服務,為安龍各地企業和個人服務,聯系電話:13518219792
因為HDFS支持6種字符集編碼,每個本地文件編碼方式又是極可能不一樣的,我們上傳本地文件的時候其實就是把文件編碼成字節流上傳到文件系統存儲。
,代碼主要邏輯如下:
// 讀取要導入數據的文件
BufferedReader br = new BufferedReader(new FileReader(
"D:\\test\\test.txt"));
String json = null;
int count = 0;
// 開啟批量插入
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();
登錄后復制
?
運行后發現一個問題,我100多萬條的數據,導入到es中怎么生成了1000多萬條,而且還是在沒有完全導入的情況下
然后用小批量數據導入到es,再把這些數據導出來,發現有好多重復的數據
為什么會重復呢,原因是在每一千條提交一次代碼這塊,第一次一千條提交了,并沒有把bulkRequest置空,所以第二次提交的時候,會提交兩千條,包括第一次已經提交的一千條,然后我們自己也沒有設置_id,所以es會自動給數據生成一個_id,即使是重復的數據,搞清楚了原因,下面來說解決方法,主要有兩種:
第一種就是在提交了一千條后,對bulkRequest進行重置,因為bulkRequest并沒有重置的方法,所以可以新建一個bulkRequest,類似于重置,具體代碼如下:
// 讀取要導入數據的文件
BufferedReader br = new BufferedReader(new FileReader(
"D:\\test\\test.txt"));
String json = null;
int count = 0;
// 開啟批量插入
BulkRequestBuilder bulkRequest = client.prepareBulk();
while ((json = br.readLine()) != null) {
bulkRequest.add(client.prepareIndex("test", "all")
.setSource(json));
// 每一千條提交一次
if (count % 1000 == 0) {
bulkRequest.execute().actionGet();
//此處新建一個bulkRequest,類似于重置效果
bulkRequest = client.prepareBulk();
System.out.println("提交了:" + count);
}
count++;
}
bulkRequest.execute().actionGet();
System.out.println("插入完畢");
br.close();
登錄后復制
?
第二種就是自己設置_id,確保每一條數據只有一個_id,這樣的話,即使數據重復了,因為_id是一樣的,所以es會進行更新,這樣的話并沒有從根源上解決數據重復的問題,只是重復數據會更新,這樣的話效率會慢,具體代碼如下:
// 讀取要導入數據的文件
BufferedReader br = new BufferedReader(new FileReader(
"D:\\test\\test.txt"));
String json = null;
int count = 0;
// 開啟批量插入
BulkRequestBuilder bulkRequest = client.prepareBulk();
while ((json = br.readLine()) != null) {
//設置_id為count
bulkRequest.add(client.prepareIndex("test", "all",
String.valueOf(count)).setSource(json));
// 每一千條提交一次
if (count % 1000 == 0) {
bulkRequest.execute().actionGet();
//此處新建一個bulkRequest,類似于重置效果
System.out.println("提交了:" + count);
}
count++;
}
bulkRequest.execute().actionGet();
System.out.println("插入完畢");
br.close();
登錄后復制
?
建議使用第一種方法,效率會快很多。
原因是你編譯使用的javac,把代碼編譯成版本61的class,而你的運行環境java,是一個老版本,能執行的上限是52版本。
解決方法有兩個:
1,安裝和JDK相同版本的Java運行時(JRE),并正確設置PATH變量。驗證方法是:
在黑窗口里分別輸入java -version和javac -version,兩個版本要一致,或者java的版本更高。
相關命令截圖如下:
2,編譯的時候指定運行時的版本:使用--release參數指定版本。
例如,你通過 java -version查看到版本=8,那么就按如圖的命令編譯
這4個構造函數分別是對1個,2個,3個,以及4個參數的處理,最好別刪,如果非要刪掉一些代碼的話,建議刪掉前面3個構造函數,保留最后的有4個參數那個,當然最后那個也要修改
代碼:
person(String?name,int?age,int?weight,String?address){
this.name?=?name;
this.age?=?age;
this.weight?=?weight;
this.address?=?address;
}
(PS:純手打,望采納)
分享名稱:java重復代碼解決方法 java重復代碼重構
網頁網址:http://www.2m8n56k.cn/article2/doidpic.html
成都網站建設公司_創新互聯,為您提供用戶體驗、軟件開發、網頁設計公司、移動網站建設、網站導航、靜態網站
聲明:本網站發布的內容(圖片、視頻和文字)以用戶投稿、用戶轉載內容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網站立場,如需處理請聯系客服。電話:028-86922220;郵箱:[email protected]。內容未經允許不得轉載,或轉載時需注明來源: 創新互聯