我有一个3000万个条目的列表,每个条目包含一个唯一的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条答案
按热度按时间daolsyd01#
当文件很大时,hadoops分布式处理会有帮助(更快)。一旦将数据带到hdfs,就可以使用hive或pig进行查询。两者都使用hadoopmr进行处理,您不需要为其编写单独的代码。Hive几乎像sql。从您的查询类型来看,我想您可以使用hive进行管理。如果您的查询更复杂,那么您可以考虑pig。如果您使用hive,这里是示例步骤。
将两个文件加载到hdfs中的两个单独文件夹中。
为这两个文件夹创建外部表,并为目标文件夹指定位置。
执行连接和查询!
hive> create external table hiveint_r(id string, age int, Flag1 int, Flag2 int, Flag3 int)
```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 ;
wxclj1h52#
mapreduce对于3000万个条目来说可能太过杀伤力了。你应该如何工作实际上取决于你的数据。是动态的(例如,是否会添加新条目?)如果不是,只需使用数据库,数据现在就在其中。30m条目不应该需要12小时来导入,更可能是12分钟(20字节的数据大小应该可以得到30.000个insert/秒),所以您的方法应该是修复导入。您可能希望尝试批量导入、加载数据填充、使用事务和/或随后生成索引、尝试其他引擎(innodb、myisam)。。。
您可以只得到一个大表(这样在查询时就可以去掉连接,这样可以加快它们的速度)。
当然,在将列添加到list1之后,在添加索引之后,您应该为所有列添加索引。
实际上,您可以在将数据导入mysql之前将其合并,例如,将list 2读入hashmap(c/c++/java中的hashmap,php/python中的array),然后用合并后的数据生成一个新的导入文件。实际上,读取数据只需要几秒钟。您甚至可以在这里进行求值,它不像sql那样灵活,但是如果您只有一些固定的查询,如果您的数据经常更改,那么这可能是最快的方法。
xn1cxnb43#
在map reduce中,可以使用连接技术处理这两个文件。有两种类型的连接Map边和减少边。
通过使用DistributedCacheAPI(其中一个文件应加载到内存中),可以有效地使用Map端连接。在这种情况下,您可以使用key->id and value->flag4创建一个hashmap,并且在Map阶段,您可以基于id连接数据。需要注意的一点是,文件应该尽可能大,以便可以保存在内存中。
如果两个文件都很大,请使用reduce join。
首先尝试加载内存中的第二个文件并创建Map侧连接。
或者你可以去找Pig。无论如何,pig只作为map reduce作业执行其语句。但map还原速度比Pig和 hive 快。