最後更新:2014-12-18
來源:互聯網
上載者:User
關鍵字
nbsp;
1000
jdbc
如何使用
大資料
在實習工作中,要處理一張存有204萬記錄的表,由於記錄是從互聯網上取到的,所以裡面有一些不太理想的詞,比如一些詞裡混有特殊字元,標點符號,或者有些詞根本就是標點符號等等。 我寫這個程式的目的就是把這些不理想的詞找出來,能修改的就修改,沒有必要修改的就直接刪除。
[java]&HTTP://www.aliyun.com/zixun/aggregation/37954.html">nbsp;view plaincopy for(int i=0;i<205;i++) { String sql="select * from cat_keyword order by id limit "+i*10001+",10000"; String best="select * from cat_keyword where id>=(select id from cat_keyword order by id limit "+i*10001+",1)limit 1 0000"; rs=stmt.executeQuery(best); go.filt(rs); }
經試驗,第一條sql語句的執行效率是明顯不如第二條的。
String best="select * from cat_keyword where id>=(select id from cat_keyword order by id limit "+i*10001+",1)limit 1000 0";
這條SQL語句尤其適用于offset特別大的情景,因為200多萬條記錄,到中後期,這個offset是很大的,使用未經優化的SQL語句,到後期是越來越慢。
另外limit的取值也很有考究,我試過1000,10000,70000,100000的,最後發現limit取10000的時候速度是最快的,這個跟資料的大小,電腦以及資料庫記憶體的分配都有一定的關係, 大家可以根據具體情況具體討論。 我這裡僅僅提一下需要注意,可以優化的point。
我真正想說的是我想的另外一種解決方案,運用JDBC
下面給大家說下我這個程式的構造,首先是一個實現將需要刪除和修改的詞插入另一張表的方法
[java] view plaincopy //將找到的違規詞插入cat_garbage表裡 public void insert( ResultSet rs) throws SQLException { Connection conn=null; Statement stmt=null; try{ conn=Good.getConnection(); stmt = conn.createStatement(ResultSet.TYPE_SCROLL_ INSENSITIVE , ResultSet.CONCUR_UPDATABLE ); String query="select * from cat_ garbage where id='"+rs.getInt("id")+"'"; ResultSet rst=stmt.executeQuery(query); if(!rst.next()) { String sql1="insert into cat_garbage(id,cid, name,keyword) values('"+rs.getInt("id")+"','"+rs.getInt("cid")+"','"+rs.getString("name")+"','"+ rs.getString("keyword")+"')"; stmt.executeUpd ate(sql1); } }   ; catch(SQLException| ClassNotFoundException| IOException e) { e.printStackTrace( ); } finally { if(stmt!= null) stmt.close(); if(conn!=&n bsp;null) conn.close(); &nbs p; } }
然後是一個將可以修復的詞修復的方法
[java] view plaincopy public void modify(ResultSet rs,String str,String reg) throws SQLException {