5000万件の乱数記録、どのように重複を取り除きますか?
今日、お客様の要求を受けて、26文字の大文字と英語のアルファベットに8文字(0と1を除いて、アルファベットのI/Oに似ているため)を加えて11桁のランダム文字列を生成しました.繰り返してはいけません.(お客様は飲料を生産する企業で、文字が瓶の蓋に打たれて、抽選用)
見た目は簡単ですが、肝心なのは5300万本です.
ステップ1:javaでランダムコードを生成し、DBに挿入し、1000件を1回提出し、プロセス全体に20分以上かかりました.
ステップ2:重複データを削除します.
1、本来はselect文で重複データを検索して削除することを考えていた.
その後、この方法があまりにも無邪気であることに気づき、5300万件のデータを数分待ってから、Cancelしました.
DBAに教えてもらい、md 5アルゴリズムを使うことをお勧めします.そうすると、結果が繰り返されないことを保証できます.しかしmd 5は暗号化された結果が長く、32ビットのようですが、私のお客様は11ビットのものを望んでいます.
その後、DBAは別の方法を提案し、一時テーブルを再構築し、元のテーブルの中の非重複データを選択し、一時テーブルを挿入します.
やはり5分足らずで、実行は終了.
終了後a 1表の記録総数:52999665を見て335件の重複記録を除いた.
ステップ3:データをエクスポートします.
プログラムを書いてtxtファイルに導いて、何も言うことはありませんが、少し遅いです.(本当はexcelに保存したかったのですが、残念ながらsheetごとに65536本しか保存できませんでした..!)
個人的な感覚はもっと良い方法があるはずです.特にランダムコードを生成しています.重複しないレコードを直接生成する方法があればよい.
見た目は簡単ですが、肝心なのは5300万本です.
ステップ1:javaでランダムコードを生成し、DBに挿入し、1000件を1回提出し、プロセス全体に20分以上かかりました.
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class RandCode {
/**
* ,
* @param agrs
*/
public static void main(String[] agrs){
Connection conn = getConnection();
try{
PreparedStatement stmt = conn.prepareStatement("insert into A2 values(?)");
String temp = "";
StringBuffer buf = new StringBuffer("A,B,C,D,E,F,G,H,I,J,K,L,M,N,O,P,Q,R,S,T,U,V,W,X,Y,Z");
buf.append(",2,3,4,5,6,7,8,9");
String[] arr = buf.toString().split(",");
for(int k = 0; k < 53000; k++){
for (int i = 0; i < 1000; i++){
temp = getPswd(arr);
stmt.setString(1, temp);
stmt.addBatch();
}
stmt.executeBatch();
conn.commit();
System.out.println(k);
}
}catch(SQLException e){
e.printStackTrace();
}
}
public static String getPswd(String[] arr){
StringBuffer b = new StringBuffer();
java.util.Random r;
int k ;
for(int i=0;i<11;i++){
r = new java.util.Random();
k = r.nextInt();
b.append(String.valueOf(arr[Math.abs(k % 34)]));
}
return b.toString();
}
}
ステップ2:重複データを削除します.
1、本来はselect文で重複データを検索して削除することを考えていた.
select distinct(code) from a2 t group by code having count(code) > 1;
その後、この方法があまりにも無邪気であることに気づき、5300万件のデータを数分待ってから、Cancelしました.
DBAに教えてもらい、md 5アルゴリズムを使うことをお勧めします.そうすると、結果が繰り返されないことを保証できます.しかしmd 5は暗号化された結果が長く、32ビットのようですが、私のお客様は11ビットのものを望んでいます.
その後、DBAは別の方法を提案し、一時テーブルを再構築し、元のテーブルの中の非重複データを選択し、一時テーブルを挿入します.
insert into a1 (select distinct code from a2);
やはり5分足らずで、実行は終了.
終了後a 1表の記録総数:52999665を見て335件の重複記録を除いた.
ステップ3:データをエクスポートします.
プログラムを書いてtxtファイルに導いて、何も言うことはありませんが、少し遅いです.(本当はexcelに保存したかったのですが、残念ながらsheetごとに65536本しか保存できませんでした..!)
個人的な感覚はもっと良い方法があるはずです.特にランダムコードを生成しています.重複しないレコードを直接生成する方法があればよい.