我正在使用hbase shell,想知道是否可以计算以下扫描命令过滤的值?
scan 'table', { COLUMNS => 'cf:c', FILTER => "ValueFilter( =, 'substring:myvalue' )" }
它应该在shell上显示总和。有什么想法吗?谢谢你的帮助。
fdbelqdn1#
您可以对少量行执行以下操作。
因此,我建议您必须使用hbase java客户机执行类似的操作
scan with your value filter here .... for (Result rs = scanner.next(); rs != null; rs = scanner.next()) { count++; }
我建议使用mapreduce程序来计算行数。在driver scan对象中,您需要设置值过滤器,如下例所示。
import org.apache.hadoop.conf.Configured; import org.apache.hadoop.hbase.HBaseConfiguration; import org.apache.hadoop.hbase.client.Result; import org.apache.hadoop.hbase.client.Scan; import org.apache.hadoop.hbase.filter.*; import org.apache.hadoop.hbase.io.ImmutableBytesWritable; import org.apache.hadoop.hbase.mapreduce.TableMapReduceUtil; import org.apache.hadoop.hbase.mapreduce.TableMapper; import org.apache.hadoop.mapreduce.Job; import org.apache.hadoop.mapreduce.lib.output.NullOutputFormat; import org.apache.hadoop.util.Tool; import org.apache.hadoop.util.ToolRunner; public class SimpleRowCounter extends Configured implements Tool { static class RowCounterMapper extends TableMapper<ImmutableBytesWritable, Result> { public static enum Counters { ROWS } @Override public void map(ImmutableBytesWritable row, Result value, Context context) { context.getCounter(Counters.ROWS).increment(1); } } @Override public int run(String[] args) throws Exception { if (args.length != 1) { System.err.println("Usage: SimpleRowCounter <tablename>"); return -1; } String tableName = args[0]; Scan scan = new Scan(); ``` `Filter valFilter = new ValueFilter(CompareFilter.CompareOp.GREATER_OR_EQUAL, new BinaryComparator(Bytes.toBytes("1500"))); scan.setFilter(valFilter );` ``` Job job = new Job(getConf(), getClass().getSimpleName()); job.setJarByClass(getClass()); TableMapReduceUtil.initTableMapperJob(tableName, scan, RowCounterMapper.class, ImmutableBytesWritable.class, Result.class, job); job.setNumReduceTasks(0); job.setOutputFormatClass(NullOutputFormat.class); return job.waitForCompletion(true) ? 0 : 1; } public static void main(String[] args) throws Exception { int exitCode = ToolRunner.run(HBaseConfiguration.create(), new SimpleRowCounter(), args); System.exit(exitCode); } }
1条答案
按热度按时间fdbelqdn1#
count命令不支持筛选器。只有扫描可以。
hbase shell filter+count中的afaik是不可能的。
您可以对少量行执行以下操作。
对于小数据:
因此,我建议您必须使用hbase java客户机执行类似的操作
对于海量数据(为了提高速度和并行性,我们需要使用mapreduce或其他分布式工具…):
我建议使用mapreduce程序来计算行数。在driver scan对象中,您需要设置值过滤器,如下例所示。