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

标签 join hadoop mapreduce hdfs file-processing

我是一个彻底的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 连接。

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

TextDelimited , TextLine , MultiSourceTap

关于使用hadoop连接同一目录中的两个文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15265978/

相关文章:

mysql - 当您连接 2 个具有相同模式的表并检查除一个字段外的所有字段是否相等时,如何避免在 SQL 中编写冗长的 where 子句?

sql - 与postgresql : left join vs union all性能对比

java - Hbase表未列出

linux - 如何解决 HADOOP_PREFIX replaced by HADOOP_HOME 错误?

java - 输出文件包含 Mapper Output 而不是 Reducer 输出

mysql - 是否可以在 INSERT ON DUPLICATE ON DUPLICATE KEY UPDATE 中使用 'join'

mysql - 如何根据条件选择一个表中的所有记录,而第二个表中没有记录

hadoop - Hadoop:我想知道HDFS的路径

hadoop - Jobtrackernotyetrunning错误?

hadoop - 如何将 AvroKeyValueOutputFormat 文件导入配置单元?