使用自定义文件格式加入

时间:2015-10-28 08:29:56

标签: hadoop mapreduce

如果我希望使用自定义文件格式执行Reduce Side Join,我该如何实现相同的谈论RecordReader
说我必须从两个数据集中获取数据来自Transactions表(transId,transdate,customerId,itemPurchased1,itemPurchased2,city,state,methodOfPayment)


为了从两个数据集中获取数据,我需要两个映射器。我可以为两个映射器设置两个记录读取器吗?如果是这样的话?
请与驱动程序实现一起解释。如果不可能,请建议我使用自定义文件格式实现减少边连接的方法。

提前谢谢你:)

1 个答案:

答案 0 :(得分:1)

您想要使用Reducer join连接两个数据集。

您需要两个映射器,因为它们都有不同的数据,需要单独解析。在编写输出时,您应该输出连接属性(在您的情况下可能是cust id)作为键和整个记录作为每个映射器的值。您还可以在此处过滤不必要的字段以进重要的是,你需要附加一个像(" set1:" + map value)这样的字符串,以识别减少记录来自哪个映射器。

在reducer中,您将使用cust Id作为密钥,然后该列表包含来自不同集的记录,您可以根据需要将它们加入其中。

因此,一旦编写了两个映射器,您应该让工作知道它们。这在Job类中使用MultipleInputs提到,如下所示

false

从性能方面来看,如果其中一个表很小,您可以使用分布式缓存加载该文件,然后相应地发送其他数据集。

在Mapper 1中, 从行中获取cust id:

MultipleInputs.addInputPath(job, new Path("inputPath1"), TextInputFormat.class, com.abc.HBaseMapper1.class);
MultipleInputs.addInputPath(job, new Path("inputPath2"), TextInputFormat.class, com.abc.HBaseMapper2.class);

在Mapper 2中,

context.write(new Text("custId"),new Text("@@map1@@|"+value));

在reducer中,

context.write(new Text("custId"),new Text("@@map2@@|"+value));