如何从两个不同的来源采样相同的10000条记录?

时间:2017-06-22 21:15:00

标签: java algorithm

我有两个不同的应用程序在两台不同的机器上运行。

  • 应用程序A正在从源A接收数据。
  • 应用程序B正在从源B接收数据。

技术上Source ASource B应该提供相同的数据。来源A和B不受我们控制,因为它由其他一些团队管理。

现在我想在这两个应用程序中对来自源A和B的记录进行采样。如果我从Source A采样10000条记录,那么我也想从Source B采样相同的10000条记录。我正在使用来自两个来源的userId来记录记录。所以给定一个userId我需要添加一些逻辑来我可以采样10000条记录。然后我将在我的两个应用程序中使用相同的逻辑来从源A和B获得相同的10000个采样记录。

我们从这两个来源获得了大量userId's,并且没有特定的模式,我不知道在特定时间段内我可以获得多少用户ID但是肯定会超过10000.我们一天就会得到几百万用户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中的相同10000 userId数据与源B进行比较。

1 个答案:

答案 0 :(得分:1)

您似乎有两个问题:1。如何抽样10,000条记录; 2.如何使用来自源A和B的相同userId获得相同的10,000个样本。

  1. 如果您从一个知道记录数量的文件中采样(让我们称之为N),那么您基本上以概率10000/N对每条记录进行采样。如果您不知道有多少记录(例如,数据可能来自流),那么您可以应用油藏采样。基本上你在内存和每条新记录(比如第i条记录)中保留了10,000条记录的储存库,你决定用概率10000/i保留它,如果是,那么你就从水库概率为1/10000。最终结果是,无论i的最终数字如何,每条记录都将以概率10000/i进行抽样。

  2. 无论您使用哪种方法(使用已知或未知总数进行采样),您都可以通过将随机数生成器设置为具有相同的种子来在两个应用程序中获得相同的结果。在Java中,只需使用类似Random generator = new Random(1)

  3. 的内容