使用hadoop加入两个文件在同一目录中
我是一个完整的hadoop n00b。我正在努力解决以下问题,作为我的第一个hadoop项目。我有一百万个子文件夹坐在亚马逊S3存储桶中。每个文件夹都有两个文件。文件1中有数据如下:使用hadoop加入两个文件在同一目录中
date,purchaseItem,purchaseAmount
01/01/2012,Car,12000
01/02/2012,Coffee,4
....................
文件2在以下格式的客户的信息:所有的文件夹重复在桶
ClientId:Id1
ClientName:"SomeName"
ClientAge:"SomeAge"
同样的模式。
之前我写的所有数据到HDFS,我想加入文件1和File2如下:
注册文件:
ClientId,ClientName,ClientAge,date,purchaseItem,purchaseAmount
Id1,"SomeName","SomeAge",01/01/2012,Car,12000
Id1,"SomeName","SomeAge",01/02/2012,Coffee,4
我需要为每一个文件夹,然后喂做到这一点这个连接的数据集转化为HDFS。有人可以指出,我将如何在Hadoop中实现这样的功能。向正确的方向推进将非常感激。
快速思考的是级联实现。
找出一种方法,以编程方式将您的行转换为File2的列,以便您可以遍历所有文件夹并转置该文件,以便第一列是第一行。
只是一个子文件夹: 两个方案一个TextDelimited
方案文件1和TextLine
方案文件2.设置这些为Taps
然后包每一种可能设置为MultiSourceTap
这样可以将所有这些文件合并为一个Pipe
。
此时,您应该有两个独立的MultiSourceTaps
一个用于所有File1(s),另一个用于所有File2(s)。 请记住这里的一些细节,最好将其设置为一个子文件夹,然后遍历其他几百个子文件夹并输出到其他区域,然后使用hadoop fs -getmerge
将所有输出小文件合并为一个大的一个。
与层叠主题保持一致,那么你可以构建Pipe
s到添加使用new Insert(subfolder_name)
内Each
功能,使您的两个数据集必须来自的子文件夹的引用,它们连接在一起,然后将子文件夹名称...加入他们使用级联CoGroup
或Hive-QL加入。
可能比这更容易实现,但这是想到很快想到的。 :)
这看起来很有希望。谢谢! – 2013-04-04 05:32:05
很高兴你发现它很有用! – Engineiro 2013-04-04 13:45:34
可能是你可以考虑,加载这些文件以编程RDBMS像MySQL数据库,他们加入到表在数据库和使用Sqoop转储表HDFS。我认为这非常直截了当。 – Alper 2013-03-07 08:41:03
@Alper - 谢谢。我正在考虑更多地使用map作业来确定fileNames,它是/ path/to/file1和一些/ path/to/file2。“some/path/to”可以用作键,值将是File1的行条目和File2的分析内容。在缩小阶段,我在考虑是否可以根据关键字“some/path/to”加入条目。我几乎对Map-Reduce几乎一无所知,所以也许这不是要走的路。 – 2013-03-07 08:56:46
你必须小心如何使用hadoop和mapreduce作业,当你在hdfs中有大量内容的文件时,Hadoop会发挥它的魔力。我无法理解你的方式,但将你的文件移动到hdfs系统似乎不适合mapreduce解决方案。 – Alper 2013-03-07 09:50:35