十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
1.HBase如果加了列限定,如果该列不存在时返回的结果为empty. 看下面的代码:
创新互联是一家专注于成都网站设计、成都网站制作与策划设计,武安网站建设哪家好?创新互联做网站,专注于网站建设10余年,网设计领域的专业建站公司;建站业务涵盖:武安等地区。武安做网站价格咨询:028-86922220Get get = new Get(Bytes.toBytes("100")); get.addColumn(Bytes.toBytes("info"), Bytes.toBytes("name"));
这里加入了列限定,也就是只返回列族info下面的name字段。但是如果name字段根本不存在,返回的Result在调用 result.isEmpty()时则返回为true,也就是说就算其他字段存在,也什么都没返回来,包括rowkey也没有返回来。当然,如果是限定多 个列,只要一个列存在就可以正常返回。所以需要注意。
2.HBase在scan时指定的StartRow里面不能加“-” 看下面的代码:
Scan scan = new Scan(); scan.setStartRow(Bytes.toBytes("3136947-")); scan.setStopRow(Bytes.toBytes("3136947-" + 1));
我的本意是查询rowkey以 3136947- 开头的行,但是因为我的里面有一个-(“杠”),所以什么都没返回,去掉-后正常。这说明这里是不能使用-,-也并不是转义字符,转义后也还是scan不出来的。不知道其他字符是不是也不行,没有测试。 所以需要注意。
3.HBase在scan时过滤掉指定列不存在的记录
如果想返回某个字段必须存在的行,不存在该字段的记录过滤掉不返回,方法如下:
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。
4.利用MapReduce导出hbase数据
如果hbase作为数据的输出,job设置如下:
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
另外有需要云服务器可以了解下创新互联scvps.cn,海内外云服务器15元起步,三天无理由+7*72小时售后在线,公司持有idc许可证,提供“云服务器、裸金属服务器、高防服务器、香港服务器、美国服务器、虚拟主机、免备案服务器”等云主机租用服务以及企业上云的综合解决方案,具有“安全稳定、简单易用、服务可用性高、性价比高”等特点与优势,专为企业上云打造定制,能够满足用户丰富、多元化的应用场景需求。