MapReduce是两个具有共同id的列表的可能解决方案吗?

时间:2016-05-11 10:34:34

标签: python mysql hadoop

我有一个30米条目的列表,其中包含每个条目的唯一ID和4个属性。除此之外,我还有一个包含10m条目的第二个列表,再次包含一个uniqe id和另外两个属性。 列表2中的唯一ID是列表1中ID的子集。 我想结合两个列表进行一些分析。

实施例

清单1:

ID|Age|Flag1|Flag2|Flag3
------------------------
ucab577|12|1|0|1
uhe4586|32|1|0|1
uhf4566|45|1|1|1
45e45tz|37|1|1|1
7ge4546|42|0|0|1
vdf4545|66|1|0|1

清单2:

ID|Country|Flag4|Flag5|Flag6
------------------------
uhe4586|US|0|0|1
uhf4566|US|0|1|1
45e45tz|UK|1|1|0
7ge4546|ES|0|0|1

我想做分析: “45岁时有多少人有Flag4 = 1?”或者“美国所有身份证的年龄结构是什么?”

我目前的做法是将两个列表加载到关系数据库的单独表中,然后进行连接。

  • 在这种情况下,MapReduce方法是否有意义?
    • 如果是,MapReduce方法将如何?
    • 如何将列表1的属性与列表2相结合?
  • 它会带来什么好处吗? (目前我需要超过12小时才能导入数据)

3 个答案:

答案 0 :(得分:1)

当文件很大时,hadoops分布式处理有助于(更快)。一旦你将数据带到hdfs,你可以使用hive或pig进行查询。两者都使用hadoop MR进行处理,您不需要为它编写单独的代码。蜂巢几乎像sql一样。从你的查询类型我想你可以用蜂巢管理。如果您的查询更复杂,那么您可以考虑猪。如果您在这里使用配置单元是示例步骤。

  1. 将这两个文件加载到hdfs中的两个单独的文件夹中。
  2. 为它们创建外部表并为目标文件夹提供位置。
  3. 执行加入和查询!
  4. hive> create external table hiveint_r(id string, age int, Flag1 int, Flag2 int, Flag3 int)

    > row format delimited
    > fields terminated by '|'
    > location '/user/root/data/hiveint_r';  (it is in hdfs)
    

    表将自动填充数据,无需加载。 类似的方法创建其他表,然后运行连接和查询。

    select a.* from hiveint_l a full outer join hiveint_r b on (a.id=b.id) where b.age>=30 and a.flag4=1 ;
    

答案 1 :(得分:0)

MapReduce对于仅30米的条目可能有点过分。你应该如何工作取决于你的数据。是动态的(例如,是否会添加新条目?)如果没有,只需坚持使用您的数据库,数据现在就在其中。 30米的条目不需要12小时才能导入,它更可能需要12分钟(你应该可以获得30.000插入/秒,20字节数据),所以你的方法应该是修复你的导入。你可能想尝试批量导入,LOAD DATA INFILE,使用事务和/或之后生成索引,尝试另一个引擎(innodb,MyISAM),...

你可以得到一个大表(所以你可以在查询哪个会加速它们时除掉连接),例如。

Update List1 join List2 on List1.Id = List2.Id 
set List1.Flag4 = List2.Flag4, List1.Flag5 = List2.Flag5, List1.Flag6 = List2.Flag6

当然,在将列添加到List1之后以及添加索引之后,您应该为所有列添加索引。

您可以在将数据导入mysql之前实际组合数据,例如:将列表2读入散列图(c / c ++ / java中的Hashmap,php / python中的数组),然后使用组合数据生成新的导入文件。它实际上只需要几秒钟来读取数据。你甚至可以在这里进行评估,它不像sql那样灵活,但如果你只有一些固定的查询,那么如果你的数据经常变化,这可能是最快的方法。

答案 2 :(得分:0)

在map-Reduce中,您可以使用连接技术处理这两个文件。有两种类型的连接 - 地图侧和减少侧。

使用DistributedCache API可以有效地使用Map side join,其中一个文件可以在内存中加载。在您的情况下,您可以使用key-> id和value->创建HashMap。 Flag4,在地图阶段,您可以根据ID加入数据。有一点需要注意,文件应该尽可能大,以便可以保存在内存中。

如果两个文件都很大,请选择Reduce join。

首先尝试在内存中加载第二个文件并创建Map-side join。

或者你可以去找猪。无论如何,猪只执行map-reduce作业。但与PIG和HIVE相比,map-reduce速度很快。