我有一个30米条目的列表,其中包含每个条目的唯一ID和4个属性。除此之外,我还有一个包含10m条目的第二个列表,再次包含一个uniqe id和另外两个属性。 列表2中的唯一ID是列表1中ID的子集。 我想结合两个列表进行一些分析。
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
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?”或者“美国所有身份证的年龄结构是什么?”
我目前的做法是将两个列表加载到关系数据库的单独表中,然后进行连接。
答案 0 :(得分:1)
当文件很大时,hadoops分布式处理有助于(更快)。一旦你将数据带到hdfs,你可以使用hive或pig进行查询。两者都使用hadoop MR进行处理,您不需要为它编写单独的代码。蜂巢几乎像sql一样。从你的查询类型我想你可以用蜂巢管理。如果您的查询更复杂,那么您可以考虑猪。如果您在这里使用配置单元是示例步骤。
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速度很快。