使用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中实现这样的功能。向正确的方向推进将非常感激。

+0

可能是你可以考虑,加载这些文件以编程RDBMS像MySQL数据库,他们加入到表在数据库和使用Sqoop转储表HDFS。我认为这非常直截了当。 – Alper 2013-03-07 08:41:03

+0

@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

+0

你必须小心如何使用hadoop和mapreduce作业,当你在hdfs中有大量内容的文件时,Hadoop会发挥它的魔力。我无法理解你的方式,但将你的文件移动到hdfs系统似乎不适合mapreduce解决方案。 – Alper 2013-03-07 09:50:35

快速思考的是级联实现。

找出一种方法,以编程方式将您的行转换为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加入。

可能比这更容易实现,但这是想到很快想到的。 :)

TextDelimitedTextLineMultiSourceTap

+0

这看起来很有希望。谢谢! – 2013-04-04 05:32:05

+0

很高兴你发现它很有用! – Engineiro 2013-04-04 13:45:34

+0

谢谢。你能简要解释CombineFileInputFormat类如何帮助我吗? – 2013-04-02 15:39:32