2

我是一个总的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 中实现这样的目标。朝着正确的方向推动将不胜感激。

4

2 回答 2

3

很快想到的是级联的实现。

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

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

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

保持 Cascading 主题,然后您可以构造Pipes 以使用new Insert(subfolder_name)inside 和function 添加子文件夹名称,以便您的两个数据集都引用它来自的子文件夹,然后将它们连接在一起......使用级联或 Hive-Each加入它们CoGroupQL 加入。

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

TextDelimited , TextLine , MultiSourceTap

于 2013-04-03T18:44:42.187 回答
0

看看CombineFileInputFormat

于 2013-04-02T15:23:25.703 回答