我是一个彻底的hadoop n00b。我正在尝试解决以下问题作为我的第一个 hadoop 项目。我的亚马逊 S3 存储桶中有超过一百万个子文件夹。每个文件夹都有两个文件。文件1的数据如下:
date,purchaseItem,purchaseAmount
01/01/2012,Car,12000
01/02/2012,Coffee,4
....................
文件2具有以下格式的客户信息:
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 中实现这样的事情吗?我们将非常感谢朝正确方向的插入。
最佳答案
很快我想到的是级联的实现。
想出一种方法,以编程方式将 File2 的行转换为列,以便您可以迭代所有文件夹并转置文件,使第一列成为第一行。
仅针对一个子文件夹:
也许设置两个方案 a TextDelimited
文件 1 和 a 的方案 TextLine
文件 2 的方案。将它们设置为 Taps
然后将它们分别包装成 MultiSourceTap
这会将所有这些文件连接成一个 Pipe
.
此时您应该有两个单独的 MultiSourceTaps
一个用于所有文件 1,一个用于所有文件 2。
请记住此处之间的一些细节,最好仅针对一个子文件夹进行设置,然后迭代其他一百万个子文件夹并输出到其他区域,然后使用 hadoop fs -getmerge
将所有输出的小文件合并为一个大文件。
保持 Cascading 主题,然后你可以构建 Pipe
使用 new Insert(subfolder_name)
添加子文件夹名称里面和 Each
函数,以便您的两个数据集都有对其来源的子文件夹的引用,然后将它们连接在一起...使用级联连接它们 CoGroup
或 Hive-QL 连接。
可能有比这更容易的实现,但这是我快速想到的。 :)
关于使用hadoop连接同一目录中的两个文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15265978/