如果我希望使用自定义文件格式执行Reduce Side Join,我该如何实现相同的谈论RecordReader
说我必须从两个数据集中获取数据
来自Transactions表(transId,transdate,customerId,itemPurchased1,itemPurchased2,city,state,methodOfPayment)
提前谢谢你:)
答案 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));