我试图使用批量扫描从HBase表中删除行。当我将此代码作为类文件运行时,它运行正常。但是当我将代码作为JAR运行时,它会给我以下异常:
线程“main”中的异常java.lang.NoSuchMethodError:org.apache.hadoop.hbase.client.Scan.setBatch(I)V
这是我的代码:
public class Purge {public static void main(String [] args)抛出IOException,InterruptedException {
if (args.length != 3 ) {
System.out.println("Incorrect number of arguments");
System.out.println("Correct Usage: java Purge <table> <column name> <value>");
System.out.println("Exiting .....");
System.exit(0);
}
String tablename = args[0];
String column = args[1];
String value = args[2];
Configuration conf = HBaseConfiguration.create();
Connection connection = ConnectionFactory.createConnection(conf);
Table table = connection.getTable(TableName.valueOf(tablename));
List<Delete> deleteList = new ArrayList<Delete>();
Scan scan = new Scan();
scan.setBatch(100);
scan.addColumn(Bytes.toBytes("cf1"),Bytes.toBytes(column));
Filter filter = new ValueFilter(CompareFilter.CompareOp.LESS_OR_EQUAL,new BinaryComparator(Bytes.toBytes(value)));
scan.setFilter(filter);
ResultScanner scanner=table.getScanner(scan);
for (Result rr : scanner) {
Delete d=new Delete(rr.getRow());
deleteList.add(d);
}
table.delete(deleteList);
}
}
我在命令行下面使用:
HADOOP_CLASSPATH = hbase mapredcp
hadoop jar purge.jar清除“$ table”“$ column”“$ timestamp”
“当我作为班级使用时”是什么意思?无论如何,当一些lib丢失时,通常会出现这种异常:在编译过程中可能看到的lib(因此编译成功),但是在启动编译的jar时却没有,因为环境可能不同。
可能它在从IDE(如eclipse)启动时起作用,因为库是由eclipse类路径管理的,当你将.jar放在编译它的类路径之外时,它不起作用,因为有一些jar丢失了。尝试找到缺少的lib,然后将它们放在类路径中。
您应该尝试使用ScanBuilder API设置扫描属性: