2017-06-22 13 views
1

私は2つの異なるマシンで動作している2つの異なるアプリケーションを持っています。2つの異なるソースから同じ10000レコードをサンプルする方法は?

  • アプリケーションAは、

技術Source ASource Bが同じデータを提供するようになっている

  • アプリケーションBがソースBからデータを受信して​​いるソースAからデータを受信して​​います。ソースAとBは、他のチームによって管理されているため、私たちによって管理されていません。

    この2つのアプリケーションでは、ソースAとBの両方から取得したレコードをサンプルします。 Source Aから10000レコードをサンプリングしている場合は、Source Bから同じ10000レコードをサンプリングしたいと考えています。私はuserIdを使って両方のソースからレコードをサンプリングしています。だからuserId私は10000レコードをサンプリングすることができるいくつかのロジックを追加する必要があります。そして、両方のアプリケーションで同じロジックを使用して、ソースAとBの両方から同じ10000のサンプルレコードを取得します。

    userId'sは両方のソースから集めていますが、特定のパターンはありません私が特定の期間にどれだけ多くのユーザーIDを取得できるのか分かりませんが、間違いなく10000を超えることになります。私たちは1日に数百万人のユーザーIDを取得しています。

    私は10000レコードをサンプリングできるように、これに使用するアルゴリズムとロジックは何ですか?私は両方のアプリケーションで同じロジックを使用したい..これを行う方法はありますか?私はここでモジュラスを使うことを考えていましたか?両方のアプリケーションで以下のコードと全く同じコードを使用していますので、両方のアプリケーションで同じロジックを使用します。

    public void writeToDatabase(final Holder holder) { 
        String userId = holder.getUserId(); 
        // how to make sure that we are storing only 10000 user data in database 
        // and it should be same user data from both the system. 
        // I was thinking of using hashCode as below but I don't think so it is 
        // right way to use it 
        if (userId.hashCode() < 10000) { 
         // write to database   
        } 
        } 
    

    源(AとB)の両方から同じデータを記憶した後、私は、これら二つのソースの間にいくつかのデータ品質の比較を行う必要があります。基本的には、ソースAとソースBの10000 userIdデータを比較します。

  • +1

    [貯水池のサンプリング](https://en.wikipedia.org/wiki/Reservoir_sampling) – amit

    答えて

    1

    2つの問題があるようです。ソースAとBの両方から同じユーザーIDと同じ万個のサンプルを入手する方法2.

    1. あなたは、あなたがレコードの数を(のはNそれを呼びましょう)を知っているファイルからサンプリングされている場合基本的に各レコードを確率10000/Nでサンプリングします。いくつのレコードがあるかわからない場合(たとえば、データがストリームから来る可能性がある)、リザーバサンプリングを適用できます。基本的には、10,000レコードのリザーバをメモリに保持し、新しいレコード(例えば、iレコード)ごとに確率10000/iで保存することにします。もしそうならば、確率でリザーバからレコードを取り出す1/10000。最終的な結果は、iの最終的な数に関係なく、各レコードは確率10000/iでサンプリングされることになります。

    2. どちらのアプローチでも(既知または未知の合計でサンプリングする)、どちらのアプリケーションでも同じ乱数ジェネレータを設定することで同じ結果が得られます。 Javaでは、Random generator = new Random(1)のようなものを使用してください。

    +0

    あなたは私のロジックは、Javaのようにどのように見えるかを理解するのに役立ちます。私は以前にリザーバのサンプリングを使用していませんでしたので、どのようにこれがうまくいくのか分かりません。 –

    +0

    @shortcut:Wikipediaのリザーバサンプリングに関する記事の "Algorithm R"の疑似コードに従ってください。 https://en.wikipedia.org/wiki/Reservoir_sampling#Algorithm_R。また、実装を見つけるためにgoogle "reservoir sampling java"を使うこともできます。 – stackoverflowuser2010

    +0

    サンプル・サンプル[here](https://github.com/twitter/commons/blob/master/src/java/com/twitter/common/stats/ReservoirSampler.java)が見つかりました。これはあなたが意味することですか?今私のユースケースでこれを使うことができますか?何かご意見は? –

    関連する問題