HBase操做注意事项

1.HBase若是加了列限定,若是该列不存在时返回的结果为empty. 看下面的代码:      java

  Get get = new Get(Bytes.toBytes("100"));
    get.addColumn(Bytes.toBytes("info"), Bytes.toBytes("name"));

这里加入了列限定,也就是只返回列族info下面的name字段。可是若是name字段根本不存在,返回的Result在调用 result.isEmpty()时则返回为true,也就是说就算其余字段存在,也什么都没返回来,包括rowkey也没有返回来。固然,若是是限定多 个列,只要一个列存在就能够正常返回。因此须要注意。mongodb

2.HBase在scan时指定的StartRow里面不能加“-” 看下面的代码:apache

Scan scan = new Scan();
scan.setStartRow(Bytes.toBytes("3136947-")); scan.setStopRow(Bytes.toBytes("3136947-" + 1));

个人本意是查询rowkey以 3136947- 开头的行,可是由于个人里面有一个-(“杠”),因此什么都没返回,去掉-后正常。这说明这里是不能使用-,-也并非转义字符,转义后也仍是scan不出来的。不知道其余字符是否是也不行,没有测试。 因此须要注意。
app


3.HBase在scan时过滤掉指定列不存在的记录ide

若是想返回某个字段必须存在的行,不存在该字段的记录过滤掉不返回,方法以下:oop

Scan scan = new Scan();
scan.setStartRow(Bytes.toBytes("3136947"));
scan.setStopRow(Bytes.toBytes("3136947" + 1));
scan.addColumn(Bytes.toBytes("info"),Bytes.toBytes("name"));
SingleColumnValueFilter filter = new SingleColumnValueFilter(Bytes.toBytes("info"),
                Bytes.toBytes("name"),
                CompareFilter.CompareOp.NOT_EQUAL, Bytes.toBytes("0"));
filter.setFilterIfMissing(true);
scan.setFilter(filter);

注意:若是是判断某个列是否存在,必须在addColumn里面加上该列,也就是必须返回的字段里面必须包含该列,不然也不会返回,由于在处理的时候是调用addColumn而后才会调用过滤器。测试

这里的过滤器里面指定该列的字段值必须不等于0(固然,若是你的name里有等于0的固然不能使用0),而且设置setFilterIfMissing为true,也就是设置为若是该列不存在就过滤掉这条数据,默认为false。orm

4.利用MapReduce导出hbase数据继承

若是hbase做为数据的输出,job设置以下:hadoop

Configuration conf = HBaseConfiguration.create();
Scan scan = new Scan();
scan.setStartRow(Bytes.toBytes("3136947"));
scan.setStopRow(Bytes.toBytes("3136947" + 1));
scan.addColumn(Bytes.toBytes("info"), Bytes.toBytes("name"));
scan.addFamily(UserStoreHelper.FAMILY_INFO);
scan.addColumn(UserStoreHelper.FAMILY_INFO, UserStoreHelper.USER_ID);
scan.addColumn(UserStoreHelper.FAMILY_INFO, UserStoreHelper.FRIENDS);
scan.addColumn(UserStoreHelper.FAMILY_INFO, UserStoreHelper.LEVEL_CODE);
final Job job = new Job(conf, "exportHBaseUser");
job.setJarByClass(TestJobCreator.class);
job.setOutputFormatClass(TextOutputFormat.class);
FileOutputFormat.setOutputPath(job, new Path("test1"));
TableMapReduceUtil.initTableMapperJob(Bytes.toBytes("usertable"),
                scan,
                TestMapper.class,
                Text.class,
                NullWritable.class,
                job);

在initTableMapperJob里面设置的map必须继承org.apache.hadoop.hbase.mapreduce.TableMapper,而且最后两个设置的参数是本身定义的map的输出时的key和value的类型。

5.利用mapReduce插入数据到HBase

若是hbase做为数据的输入。代码以下:

final Configuration conf = HBaseConfiguration.create();
final Job job = new Job(conf, "Sync-To-HBase");
job.setJarByClass(PostStoreExportHBaseJobCreator.class);
//我这里是以mongodb为输入     
job.setInputFormatClass(MongoInputFormat.class);
TableMapReduceUtil.initTableReducerJob("usertable", null, job);
//把数据转换为hbase表格式的map
job.setMapperClass(TestMapper.class);
//直接入hbase库不须要reduce    
job.setNumReduceTasks(0);

这里map的输出必须是key为ImmutableBytesWritable,value为 Put 

相关文章
相关标签/搜索