HBase mapreduce作业 - 多次扫描 - 如何设置每次扫描的表

时间:2017-03-15 10:20:35

标签: hadoop mapreduce hbase

我使用的是HBase 1.2。我想使用多次扫描在HBase上运行MapReduce作业。在API中,有: classId char(8) userId char(1) 666666 2

但是如何指定每次扫描的表?我使用下面的代码:

Query query = em.createQuery("select classId from user where userId = ?")
query.setParameter(1,"2");
List<Object[]> list = query.getResultList();

它提供以下异常

TableMapReduceUtil.initTableMapperJob(List<Scan> scans, Class<? extends TableMapper> mapper, Class<?> outputKeyClass, Class<?> outputValueClass, org.apache.hadoop.mapreduce.Job job)

我认为这是正常的,因为应该应用每次扫描的表格都没有在任何地方指定。

但怎么办呢?

我尝试添加

List<Scan> scans = new ArrayList<>();
for (String firstPart : firstParts) {
    Scan scan = new Scan();
    scan.setRowPrefixFilter(Bytes.toBytes(firstPart));
    scan.setCaching(500);
    scan.setCacheBlocks(false);
    scans.add(scan);
}
TableMapReduceUtil.initTableMapperJob(scans, MyMapper.class, Text.class, Text.class, job);

但它给出了同样的错误

1 个答案:

答案 0 :(得分:2)

来自文档https://hbase.apache.org/apidocs/org/apache/hadoop/hbase/mapreduce/MultiTableInputFormat.html

List<Scan> scans = new ArrayList<Scan>();

 Scan scan1 = new Scan();
 scan1.setStartRow(firstRow1);
 scan1.setStopRow(lastRow1);
 scan1.setAttribute(Scan.SCAN_ATTRIBUTES_TABLE_NAME, table1);
 scans.add(scan1);

 Scan scan2 = new Scan();
 scan2.setStartRow(firstRow2);
 scan2.setStopRow(lastRow2);
 scan1.setAttribute(Scan.SCAN_ATTRIBUTES_TABLE_NAME, table2);
 scans.add(scan2);

 TableMapReduceUtil.initTableMapperJob(scans, TableMapper.class, Text.class,
     IntWritable.class, job);

您的案例:

使用Scan.SCAN_ATTRIBUTES_TABLE_NAME 因为你没有在扫描实例级别设置表,所以你得到了这个NPE ...

请按照此示例进行操作,您必须在for循环内设置表名,而不是在外面...然后它应该可以正常工作

List<Scan> scans = new ArrayList<Scan>();

  for(int i=0; i<3; i++){
    Scan scan = new Scan();

    scan.addFamily(INPUT_FAMILY);
    scan.setAttribute(Scan.SCAN_ATTRIBUTES_TABLE_NAME, Bytes.toBytes(TABLE_NAME ));

    if (start != null) {
      scan.setStartRow(Bytes.toBytes(start));
    }
    if (stop != null) {
      scan.setStopRow(Bytes.toBytes(stop));
    }

    scans.add(scan);

    LOG.info("scan before: " + scan);