使用hadoop在同一目录中连接两个文件

时间:2013-03-07 08:01:41

标签: join hadoop mapreduce hdfs file-processing

我是一个完整的hadoop n00b。我试图解决以下问题作为我的第一个hadoop项目。我在亚马逊S3桶中有一百万个+子文件夹。每个文件夹都有两个文件。文件1的数据如下:

date,purchaseItem,purchaseAmount
01/01/2012,Car,12000
01/02/2012,Coffee,4
....................

File2以下列格式提供客户信息:

ClientId:Id1
ClientName:"SomeName"
ClientAge:"SomeAge"

在存储桶中的所有文件夹中重复相同的模式。

在将所有这些数据写入HDFS之前,我想按如下方式加入File1和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中实现这样的功能。推动正确的方向将非常受欢迎。

2 个答案:

答案 0 :(得分:3)

快速想到的是级联中的实现。

找出一种以编程方式将行转换为File2列的方法,以便您可以遍历所有文件夹并转置文件,以便第1列是第1行。

仅适用于一个子文件夹: 也许为文件1设置两个方案TextDelimited方案和文件2的TextLine方案。将它们设置为Taps然后将每个方案包装成MultiSourceTap这个连接将所有这些文件合并为一个Pipe

此时,对于所有File1(s),您应该有两个单独的MultiSourceTaps,对于所有File2(s),应该有一个hadoop fs -getmerge。 请记住这里之间的一些细节,最好只为一个子文件夹设置它,然后迭代其他百万个子文件夹并输出到其他区域,然后使用Pipe使所有输出变小文件分成一个大的。

保持Cascading主题,然后您可以构建new Insert(subfolder_name)以使用Each内部和CoGroup函数添加子文件夹名称,以便您的数据集都具有对子文件夹的引用它来自于将它们连接在一起然后...使用级联{{1}}或Hive-QL加入加入它们。

可能有一个比这更简单的实现,但这是我想到的快速思考。 :)

TextDelimitedTextLineMultiSourceTap

答案 1 :(得分:0)