JAvaマスデータの簡単な洗浄
1876 ワード
今週は、データの抽出をクリーンアップするタスクが続き、具体的には、100万に近いkey値テーブルがあり、各keyは1つのオブジェクトに対応していますが、esには類似オブジェクトが大量に存在し、類似度に従ってkey値テーブルで重複するオブジェクトをクリーンアップする必要があります.
私の考えを簡単に紹介します.
ファイルの準備
百万レベルのデータのクリーンアップは、シングルマシンモードでは時間がかかるため、いくつかの異常の発生を考慮し、重複するkey値を一時的に保存する必要があるため、3つの一時ファイルを構築する必要があります.
touch out.json set.json error.json
出力ファイル、key値一時保存ファイル、エラーファイルをそれぞれ表します.
再試行メカニズムの簡単な実現
クエリにesを呼び出すとタイムアウトする場合があります.サービスの直接停止を防ぐために、例外をキャプチャして処理する必要があります.
再試行については、次のように考えられます.
現在のkeyの失敗回数を1つのmapで集計し、異常になったら現在の失敗回数を判断し、3回を超えるとエラーファイルを書き込み、次のkeyにジャンプし、3回に達しない場合はキューヘッダに入れ、次回は再試行を続けます
洗浄開始
まずキューにデータを読み込みます
次に、現在のkey去esで一意のオブジェクトを検索し、オブジェクト値で類似のkeyを検索してsetに格納します.
キューに存在する類似keyを削除
現在の実行の進捗状況を統計したほうがいいです.例えば、千個ごとに出力します.
今日の紹介はここまでですが、問題があれば、ブロガーに連絡してください.
払わないで、収穫を考えないでください
私の考えを簡単に紹介します.
ファイルの準備
百万レベルのデータのクリーンアップは、シングルマシンモードでは時間がかかるため、いくつかの異常の発生を考慮し、重複するkey値を一時的に保存する必要があるため、3つの一時ファイルを構築する必要があります.
touch out.json set.json error.json
出力ファイル、key値一時保存ファイル、エラーファイルをそれぞれ表します.
再試行メカニズムの簡単な実現
クエリにesを呼び出すとタイムアウトする場合があります.サービスの直接停止を防ぐために、例外をキャプチャして処理する必要があります.
再試行については、次のように考えられます.
catch (Exception e) {
//
if (map.getOrDefault(key, 0) >= 3) {
FileWriter fw2 = new FileWriter(errorFile, true);
fw2.write("\"" + key + "\"" + ",");
fw2.close();
continue;
}
log.warn("error!", e);
//
list.addFirst(key);
map.put(key,map.getOrDefault(key, 0) + 1);
}
現在のkeyの失敗回数を1つのmapで集計し、異常になったら現在の失敗回数を判断し、3回を超えるとエラーファイルを書き込み、次のkeyにジャンプし、3回に達しない場合はキューヘッダに入れ、次回は再試行を続けます
洗浄開始
まずキューにデータを読み込みます
String content = FileUtils.readFileToString(file, "UTF-8");
// json values
JSONObject jsonObject = JSONObject.fromObject(content);
LinkedList list = new LinkedList<>(jsonObject.values());
次に、現在のkey去esで一意のオブジェクトを検索し、オブジェクト値で類似のkeyを検索してsetに格納します.
キューに存在する類似keyを削除
list.removeAll(set);
現在の実行の進捗状況を統計したほうがいいです.例えば、千個ごとに出力します.
if (count % 1000 == 0) {
//
log.info("count: " + count);
//
log.info("cleanCount: " + cleanCount);
FileWriter fw1 = new FileWriter(setFile, true);
fw1.write("\"" + count + "\":" + "\"" + cleanCount + "\"" + ",");
fw1.close();
}
今日の紹介はここまでですが、問題があれば、ブロガーに連絡してください.
払わないで、収穫を考えないでください