比较大数据集

时间:2013-08-08 15:22:08

标签: mysql algorithm nosql mapreduce diff

我正在寻找一种有效的方法来比较2个太大而不适合内存(1M或更多)的数据集。我把它们都作为表存在于MySQL中。我试图找到服务器和客户端之间的差异,并找到在客户端上更新,创建和删除的内容。我可以在之前对数据进行排序或对其进行排序。

input:
server = [
  {:id => 7, :rev => 1, :uuid => 111},
  {:id => 8, :rev => 3, :uuid => 222},
  {:id => 9, :rev => 1, :uuid => 333},
  ]

client = [
  {:id => 8, :rev => 2, :uuid => 222},
  {:id => 9, :rev => 1, :uuid => 333},
  {:id => 6, :rev => 1, :uuid => 444},
  ]

expected output:
create: [{:id => 7, :rev => 1, :uuid => 111}]
update: [{:id => 8, :rev => 3, :uuid => 222}]
delete: [{:id => 6, :rev => 1, :uuid => 444}]

我正在寻找一种方法来划分这个差异问题并将其分布在多个工作人员/节点上。我可以使用不同的数据存储区,如果它可以在数据存储区完成而不是在ruby或c中,那将会很棒。建议?

3 个答案:

答案 0 :(得分:0)

您可以创建数据密钥的哈希值并相应地分配工作。防爆。假设一个简单的哈希函数是“id mod 2”。因此,所有偶数id都由一台机器处理,所有奇数ID都由第二台机器处理。

在每台机器上,数据需要按排序顺序排列。

答案 1 :(得分:0)

如果您不想使用除SQL之外的编程语言,请查看以下MySQL功能:

答案 2 :(得分:0)

如果您真的想分发作品,则应使用MapReduce框架,例如Hadoop。

这个想法是你map通过客户端和服务器,将每个记录发送到一个密钥,它是id,一个值指示它来自哪个,以及它具有的值

reduce只需要处理单个id的记录,并且它具有直接的逻辑。

框架负责分发工作,如何处理机器故障等。

也就是说,如果你每个只有100万条记录,只需在本地按顺序排列,按顺序吸取整个遥控器,然后并行运行。它可能会足够快地执行,并且您在设置/使用远程框架时可以省去很多麻烦。