1

我对 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 框架现在会自动将正确的行传递给我的地图作业,对吗?

4

0 回答 0