我是个十足的hadoop n00b。作为我的第一个hadoop项目,我正在尝试解决以下问题。我有一百万个以上的子文件夹放在一个amazons3存储桶里。每个文件夹都有两个文件。文件1的数据如下:
date,purchaseItem,purchaseAmount
01/01/2012,Car,12000
01/02/2012,Coffee,4
....................
文件2包含以下格式的客户信息:
ClientId:Id1
ClientName:"SomeName"
ClientAge:"SomeAge"
相同的模式在bucket中的所有文件夹中重复。
在将所有这些数据写入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条答案
按热度按时间h43kikqp1#
很快想到的是级联实现。
找出一种方法,以编程方式将file2的行转换为列,这样就可以遍历所有文件夹并转换文件,使第一列成为第一行。
仅针对一个子文件夹:可能一次设置两个方案
TextDelimited
文件1和a的方案TextLine
文件2的方案。将这些设置为Taps
然后把每一个都包起来MultiSourceTap
这会将所有这些文件连接到一个文件中Pipe
.在这一点上,你应该有两个独立的
MultiSourceTaps
一个用于所有文件1,一个用于所有文件2。请记住这中间的一些细节,最好只为一个子文件夹设置,然后遍历其他一百万个子文件夹并输出到其他区域,然后使用hadoop fs -getmerge
把所有输出的小文件放到一个大文件中。与级联主题保持一致,然后您可以构造
Pipe
s添加子文件夹名称,使用new Insert(subfolder_name)
内部和Each
函数,以便两个数据集都有一个指向它所来自的子文件夹的引用,以便将它们连接在一起,然后。。。使用级联连接它们CoGroup
或Hiveql加入。可能有比这更容易实现的方法,但这正是快速思考时想到的
text分隔,text行,多源Map
vaqhlq812#
看看combinefileinputformat。