我对 Hadoop 真的很陌生,我无法找到我的问题的答案。我想写一个 map reduce 作业,我从 HBase 读取然后写入一个简单的文本文件。
在 HBase 中,我有一个代表 id 的列。现在我不想处理我的 HBase 表中的所有包含行,而只想处理 maxId 和 minId 之间的行。
我发现我可以使用用户过滤器(scan.setFilter)
,这样我就可以过滤与我的请求不匹配的行。
这是我的第一个 Map Reduce 工作,所以请耐心等待 :-)
我有一个入门类,我在其中配置作业和扫描对象,然后开始作业。
现在,我的第一次尝试是这样的:
private Scan getScan()
{
final Scan scan = new Scan();
// ** FILTER **
List<Filter> filters = new ArrayList<Filter>();
Filter filter1 = new ValueFilter(CompareFilter.CompareOp.GREATER_OR_EQUAL, new BinaryComparator(Bytes.toBytes(Integer.parseInt(minId))));
filters.add(filter1);
Filter filter2 = new ValueFilter(CompareFilter.CompareOp.LESS_OR_EQUAL, new BinaryComparator(Bytes.toBytes(Integer.parseInt(maxId))));
filters.add(filter2);
FilterList filterList = new FilterList(filters);
scan.setFilter(filterList);
scan.setCaching(500);
scan.setCacheBlocks(false);
// id
scan.addColumn("columnfamily".getBytes(), "id".getBytes());
return scan;
}
好吧,我不确定这是否是正确的方法。我还读到我可以将我的 minId 和 maxId 与配置对象一起传递给 Map Job,但我不确定如何。
再说了,以后我该怎么办?我通常会启动这项工作initTableMapperJob
并将扫描对象传递给它。我读过一些 ResultScanner 等,我需要它们吗?我认为 MapReduce 框架现在会自动将正确的行传递给我的地图作业,对吗?