JAvaマスデータの簡単な洗浄

1876 ワード

今週は、データの抽出をクリーンアップするタスクが続き、具体的には、100万に近いkey値テーブルがあり、各keyは1つのオブジェクトに対応していますが、esには類似オブジェクトが大量に存在し、類似度に従って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();
}

今日の紹介はここまでですが、問題があれば、ブロガーに連絡してください.
払わないで、収穫を考えないでください