溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

HBase操作注意事項(xiàng)

發(fā)布時(shí)間:2020-07-20 05:16:37 來源:網(wǎng)絡(luò) 閱讀:2341 作者:zlfwmm 欄目:關(guān)系型數(shù)據(jù)庫

1.HBase如果加了列限定,如果該列不存在時(shí)返回的結(jié)果為empty. 看下面的代碼:      

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

這里加入了列限定,也就是只返回列族info下面的name字段。但是如果name字段根本不存在,返回的Result在調(diào)用 result.isEmpty()時(shí)則返回為true,也就是說就算其他字段存在,也什么都沒返回來,包括rowkey也沒有返回來。當(dāng)然,如果是限定多 個(gè)列,只要一個(gè)列存在就可以正常返回。所以需要注意。

2.HBase在scan時(shí)指定的StartRow里面不能加“-” 看下面的代碼:

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

我的本意是查詢r(jià)owkey以 3136947- 開頭的行,但是因?yàn)槲业睦锩嬗幸粋€(gè)-(“杠”),所以什么都沒返回,去掉-后正常。這說明這里是不能使用-,-也并不是轉(zhuǎn)義字符,轉(zhuǎn)義后也還是scan不出來的。不知道其他字符是不是也不行,沒有測(cè)試。 所以需要注意。


3.HBase在scan時(shí)過濾掉指定列不存在的記錄

如果想返回某個(gè)字段必須存在的行,不存在該字段的記錄過濾掉不返回,方法如下:

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

注意:如果是判斷某個(gè)列是否存在,必須在addColumn里面加上該列,也就是必須返回的字段里面必須包含該列,否則也不會(huì)返回,因?yàn)樵谔幚淼臅r(shí)候是調(diào)用addColumn然后才會(huì)調(diào)用過濾器。

這里的過濾器里面指定該列的字段值必須不等于0(當(dāng)然,如果你的name里有等于0的當(dāng)然不能使用0),并且設(shè)置setFilterIfMissing為true,也就是設(shè)置為如果該列不存在就過濾掉這條數(shù)據(jù),默認(rèn)為false。

4.利用MapReduce導(dǎo)出hbase數(shù)據(jù)

如果hbase作為數(shù)據(jù)的輸出,job設(shè)置如下:

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里面設(shè)置的map必須繼承org.apache.hadoop.hbase.mapreduce.TableMapper,并且最后兩個(gè)設(shè)置的參數(shù)是自己定義的map的輸出時(shí)的key和value的類型。

5.利用mapReduce插入數(shù)據(jù)到HBase

如果hbase作為數(shù)據(jù)的輸入。代碼如下:

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);
//把數(shù)據(jù)轉(zhuǎn)換為hbase表格式的map
job.setMapperClass(TestMapper.class);
//直接入hbase庫不需要reduce    
job.setNumReduceTasks(0);

這里map的輸出必須是key為ImmutableBytesWritable,value為 Put 


向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI