天天看點

HBase操作注意事項

1.HBase如果加了列限定,如果該列不存在時傳回的結果為empty. 看下面的代碼:      

  Get 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

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);      

繼續閱讀