使用自定义文件格式进行联接



如果我希望使用自定义文件格式执行Reduce Side Join,我该如何实现相同的谈论RecordReader
假设我必须从两个数据集获取数据
一个来自客户表(customerid、fname、lname、age、profest)
另一个来自交易表(transId、transgate、customerid、itemPurchased1、itemPurPurchased2、city、state、methodOfPayment)


为了从两个数据库获取数据,我需要两个映射器我可以为两个映射器提供两个读记录器吗?如果是,怎么办
请与驱动程序实现一起解释。如果不可能,请建议我一种使用自定义文件格式实现减少侧联接的方法。

提前感谢:)

您想要使用Reducer联接来联接两个数据集。

您需要两个映射器,因为它们都有不同的数据,并且需要单独的解析。在编写输出时,应该将join属性(在您的情况下可能是cust-id)作为键输出,并将整个记录作为每个映射器的值输出。您也可以在此处筛选不必要的字段以进行优化。重要的是,您需要附加一个类似("set1:"+映射值)的字符串,以在reduce中标识记录来自哪个映射器。

在reducer中,您将使用cust-Id作为密钥,然后列表包含来自不同集合的两个记录,您可以根据需要将它们连接到那里。

因此,一旦编写了两个映射器,就应该让作业了解它们。这在使用MultipleInputs的作业类中提到,如下

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

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

在映射器1中,从以下行获取客户id:

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

在Mapper 2中,

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

在减速器中,

for(Text txt:values)
{
 String output;
 if(txt contains "map1"){
 //Append your output string
} else if(txt contains "map2") {
//Append your output string
}
}
context.write(key, output)

相关内容

  • 没有找到相关文章

最新更新