通過Java 操作Hbase

通過Java 操作Hbase


一潘悼、版本:

hbase:


二喉悴、操作Hbase:

1祸挪、首先定義幾個(gè)用的到的全局變量:

HBaseAdmin :主要對于表的一些設(shè)置操作

HBaseAdmin hBaseAdmin;

HTable:主要涉及到對標(biāo)內(nèi)容的操作

HTable hTable;

TN:測試的表名

String TN = "lillcol";

2外潜、創(chuàng)建begin()方法初始化資源:

//初始化Configuration? hBaseAdmin hTable

public void begin() throws Exception {

Configuration conf = new Configuration();

// conf.set("hbase.zookeeper.quorum", "node1.noce2.noce3");

hBaseAdmin = new HBaseAdmin(conf);

hTable = new HTable(conf, TN);

}

3原环、創(chuàng)建end()方法關(guān)閉資源:

//關(guān)閉hBaseAdmin? hTable 資源 注意先判斷是否為null

public void end() {

if (hBaseAdmin != null) {

try {

hBaseAdmin.close();

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

if (hTable != null) {

try {

hTable.close();

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}

4、創(chuàng)建一個(gè)Table

注:不同版本可能會有不一樣的方法处窥,此方法適合0.9的嘱吗,至于1.0是否能用后面會嘗試?

//創(chuàng)建一個(gè)新的Table


public void createTable() throws Exception {


//初始化

begin();

//首先判斷表存不存在? 存在刪除

if (hBaseAdmin.tableExists(TN)) {

hBaseAdmin.disableTable(TN);

hBaseAdmin.deleteTable(TN);

}

//1.2以后的版本 好像不用 HTableDescriptor了

//過段時(shí)間在更新1.2以后的版本

HTableDescriptor desc = new HTableDescriptor(TableName.valueOf(TN));

//創(chuàng)建列族

HColumnDescriptor family1 = new HColumnDescriptor("column1");

//對表的一些設(shè)置

family1.setBlockCacheEnabled(true);

family1.setInMemory(true);

family1.setMaxVersions(2);

//添加列族

desc.addFamily(family1);

hBaseAdmin.createTable(desc);

System.out.println("create table success");

//關(guān)閉資源

end();

}

5、模擬插入數(shù)據(jù)(參考了尚學(xué)堂的學(xué)習(xí)資料 模擬數(shù)據(jù))

// 獲得手機(jī)號? ?

?public String getPhoneNum(String prefix) {? ? ? ??

return prefix + String.format("%8d", r.nextInt(999999999));

? ? }?

?? //獲得日期? ? public String getDate(String year) {?

?? ? ? return year+ String.format( ?"%02d%02d%02d%02d%02d", new Object[] { r.nextInt(12) + 1, r.nextInt(29) + 1, r.nextInt(60), r.nextInt(60), r.nextInt(60) });? ? }?

?? public void insertDB() throws Exception {??

? ? ? begin();? ?

?? // 創(chuàng)建一個(gè)List緩存? ? ?

?? Listputs = new ArrayList();

//為一個(gè)用戶生成十條模擬數(shù)據(jù)

for (int i = 0; i < 10; i++) {

String rowKey;

String phoneNum = getPhoneNum("186");

for (int j = 0; j < 100; j++) {

String phoneData = getDate("2016");

SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");

try {

long dataLong = sdf.parse(phoneData).getTime();

rowKey = phoneNum + (Long.MAX_VALUE - dataLong);

// System.out.println(rowKey);

Put put = new Put(rowKey.getBytes());

put.add("column1".getBytes(), "name".getBytes(), "lillcol".getBytes());

//將入list緩存

puts.add(put);

} catch (ParseException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}

//批量添加數(shù)據(jù)

hTable.put(puts);

end();

}


6滔驾、查詢數(shù)據(jù)

//查詢數(shù)據(jù)


public void scandDB() throws Exception {

begin();

Scan scan = new Scan();

SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");

//設(shè)置開始rowKey? 和結(jié)束rowKey

String startRowKey = "18828394827" + (Long.MAX_VALUE - sdf.parse("2016010100000").getTime());

scan.setStartRow(startRowKey.getBytes());

String stopRowKey = "18828394827" + (Long.MAX_VALUE - sdf.parse("2016020100000").getTime());

scan.setStopRow(stopRowKey.getBytes());

ResultScanner scanner = hTable.getScanner(scan);

for (Result rs : scanner) {

//rs.getColumnLatestCell("colmun1".getBytes(), "name".getBytes())) 獲取到的數(shù)據(jù)需要經(jīng)過CellUtil.cloneValue在轉(zhuǎn)換成String

System.out.println(new String(CellUtil.cloneValue(rs.getColumnLatestCell("colmun1".getBytes(),

"name".getBytes()))));

}

end();

}


7谒麦、帶過濾器的查詢

//具體的方法可以去看官網(wǎng)的文檔

//帶過濾器的查詢


public void scandDB2() throws Exception {

begin();

FilterList list = new FilterList(FilterList.Operator.MUST_PASS_ALL);

PrefixFilter prefixFilter = new PrefixFilter("18827385967".getBytes());

list.addFilter(prefixFilter);

SingleColumnValueExcludeFilter singleColumnValueExcludeFilter = new SingleColumnValueExcludeFilter(

"colmun1".getBytes(), "name".getBytes(), CompareOp.EQUAL, "lillcol".getBytes());

list.addFilter(singleColumnValueExcludeFilter);

Scan scan = new Scan();

scan.setFilter(list);

SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");

String startRowKey = "18828394827" + (Long.MAX_VALUE - sdf.parse("2016010100000").getTime());

scan.setStartRow(startRowKey.getBytes());

String stopRowKey = "18828394827" + (Long.MAX_VALUE - sdf.parse("2016020100000").getTime());

scan.setStopRow(stopRowKey.getBytes());

ResultScanner scanner = hTable.getScanner(scan);

for (Result rs : scanner) {

System.out.println(new String(CellUtil.cloneValue(rs.getColumnLatestCell("colmun1".getBytes(),

"name".getBytes()))));

}

end();

}

8、獲取某條數(shù)據(jù)

//獲取某條數(shù)據(jù)


public void get() throws Exception {

begin();

// 手機(jī)號_時(shí)間戳

String rowKey = "133456789755_20170932438765";

Get get = new Get(rowKey.getBytes());

get.addColumn("column1".getBytes(), "name".getBytes());

get.addColumn("column1".getBytes(), "age".getBytes());

Result result = hTable.get(get);

KeyValue columnLatest = result.getColumnLatest("column".getBytes(), "name".getBytes());

System.out.println("----------" + new String(CellUtil.cloneValue(columnLatest)));

end();

}

9哆致、main方法

public static void main(String[] args) throws Exception {


HbaseDemo hbaseDemo = new HbaseDemo();

System.out.println("create table main ");

hbaseDemo.createTable();

System.out.println("insert table main ");

hbaseDemo.insertDB();

}


10绕德、完整源碼

package cn.lillcol.sxt;import java.io.IOException;import java.text.ParseException;import java.text.SimpleDateFormat;import java.util.ArrayList;import java.util.List;import java.util.Random;import org.apache.hadoop.conf.Configuration;import org.apache.hadoop.hbase.CellUtil;import org.apache.hadoop.hbase.HColumnDescriptor;import org.apache.hadoop.hbase.HTableDescriptor;import org.apache.hadoop.hbase.KeyValue;import org.apache.hadoop.hbase.TableName;import org.apache.hadoop.hbase.client.Get;import org.apache.hadoop.hbase.client.HBaseAdmin;import org.apache.hadoop.hbase.client.HTable;import org.apache.hadoop.hbase.client.Put;import org.apache.hadoop.hbase.client.Result;import org.apache.hadoop.hbase.client.ResultScanner;import org.apache.hadoop.hbase.client.Scan;import org.apache.hadoop.hbase.filter.CompareFilter.CompareOp;import org.apache.hadoop.hbase.filter.FilterList;import org.apache.hadoop.hbase.filter.PrefixFilter;import org.apache.hadoop.hbase.filter.SingleColumnValueExcludeFilter;

public class HbaseDemo {??

? HBaseAdmin hBaseAdmin;??

? HTable hTable; ?

?String TN = "lillcol";?

?? Random r = new Random();?

?? // 初始化

Configuration hBaseAdmin hTable? ??

public void begin() throws Exception {? ? ? ??

Configuration conf = new Configuration();? ??

//集群跑的時(shí)候不設(shè)置 ?本地需要設(shè)置 ??

?// conf.set("hbase.zookeeper.quorum", "node1.noce2.noce3");? ? ??

? hBaseAdmin = new HBaseAdmin(conf);? ? ??

? hTable = new HTable(conf, TN);??

? }??

? // 關(guān)閉hBaseAdmin hTable 資源 注意先判斷是否為null? ?

?public void end() {? ? ? ??

if (hBaseAdmin != null) {? ?

?? ? ? ? try {? ? ??

? ? ? ? ? hBaseAdmin.close();? ? ?

?? ? ? } catch (IOException e) {? ? ??

? ? ? ? ? // TODO Auto-generated catch block? ? ? ? ? ? ??

? e.printStackTrace();? ? ??

? ? ? }? ?

?? ? } ? ?

?? if (hTable != null) {? ? ? ?

?? ? try {? ? ? ? ?

?? ? ? hTable.close();? ? ? ? ? ?

?} catch (IOException e) { ?

?? ? ? ? ? ? // TODO Auto-generated catch block? ? ? ??

? ? ? ? e.printStackTrace();? ? ? ? ? ? }? ? ? ? }? ? }? ?

?// 創(chuàng)建一個(gè)新的Table? ??

public void createTable() throws Exception {? ?

?? ? // 初始化? ? ??

? begin();? ? ? ?

?// 首先判斷表存不存在 存在刪除? ? ??

? if (hBaseAdmin.tableExists(TN)) {? ??

? ? ? ? hBaseAdmin.disableTable(TN); ? ?

?? ? ? hBaseAdmin.deleteTable(TN);? ??

? ? }? ? ?

?? // 1.2以后的版本 好像不用 HTableDescriptor了? ??

? ? // 過段時(shí)間在更新1.2以后的版本? ? ?

?? HTableDescriptor desc = new HTableDescriptor(TableName.valueOf(TN));??

? ? ? // 創(chuàng)建列族? ? ?

?? HColumnDescriptor family1 = new HColumnDescriptor("column1");? ?

?? ? // 對表的一些設(shè)置? ??

? ? family1.setBlockCacheEnabled(true);? ?

?? ? family1.setInMemory(true);? ??

? ? family1.setMaxVersions(2); ? ? ??

// 添加列族? ? 1.2版本好像不支持addFamily(方法了)

? ? desc.addFamily(family1);??

? ? ? hBaseAdmin.createTable(desc);??

? ? ? System.out.println("create table success");?

?? ? ? // 關(guān)閉資源? ?

?? ? end();? ? }? ?

?public void insert() throws Exception {? ?

?? ? begin();?

?? ? ? Listputs = new ArrayList();?

?? ? ? // 手機(jī)號_時(shí)間戳? ?

?? ? String rowKey = "133456789755_20170932438765"; ?

?? ? Put put = new Put(rowKey.getBytes());??

? ? ? put.add("column1".getBytes(), "name".getBytes(), "lillcol".getBytes());? ? ? ? put.add("column1".getBytes(), "age".getBytes(), "20".getBytes());??

? ? ? puts.add(put);??

? ? ? if (puts.size() > 10) {? ? ??

? ? ? hTable.put(puts);?

?? ? ? ? ? puts.removeAll(puts);??

? ? ? }??

? ? ? end();

? ? }??

? //獲取某條數(shù)據(jù)?

?? public void get() throws Exception {? ??

? ? begin(); ?

? ? ? // 手機(jī)號_時(shí)間戳? ? ??

? String rowKey = "133456789755_20170932438765";?

?? ? ? Get get = new Get(rowKey.getBytes());??

? ? ? get.addColumn("column1".getBytes(), "name".getBytes());??

? ? ? get.addColumn("column1".getBytes(), "age".getBytes());??

? ? ? Result result = hTable.get(get);?

?? ? ? KeyValue columnLatest = result.getColumnLatest("column".getBytes(), "name".getBytes());?

?? ? ? System.out.println("----------" + new String(CellUtil.cloneValue(columnLatest)));? ?

?? ? end();??

? }

? ? // 獲得手機(jī)號? ?

?public String getPhoneNum(String prefix) {? ??

? ? return prefix + String.format("%8d", r.nextInt(999999999));? ?

?}? ?

?//獲得日期? ?

?public String getDate(String year) {? ??

? ? return year + String.format( "%02d%02d%02d%02d%02d", new Object[] { r.nextInt(12) + 1, r.nextInt(29) + 1, r.nextInt(60), r.nextInt(60), ?r.nextInt(60) });??

? }??

? public void insertDB() throws Exception {? ??

? ? begin();? ?

?? // 創(chuàng)建一個(gè)List緩存? ? ?

?? Listputs = new ArrayList();

//為一個(gè)用戶生成十條模擬數(shù)據(jù)

for (int i = 0; i < 10; i++) {

String rowKey;

String phoneNum = getPhoneNum("186");

for (int j = 0; j < 100; j++) {

String phoneData = getDate("2016");

SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");

try {

long dataLong = sdf.parse(phoneData).getTime();

rowKey = phoneNum + (Long.MAX_VALUE - dataLong);

// System.out.println(rowKey);

Put put = new Put(rowKey.getBytes());

put.add("column1".getBytes(), "name".getBytes(), "lillcol".getBytes());

//將入list緩存

puts.add(put);

} catch (ParseException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}

//批量添加數(shù)據(jù)

hTable.put(puts);

end();

}

//查詢數(shù)據(jù)

public void scandDB() throws Exception {

begin();

Scan scan = new Scan();

SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");

//設(shè)置開始rowKey? 和結(jié)束rowKey

String startRowKey = "18828394827" + (Long.MAX_VALUE - sdf.parse("2016010100000").getTime());

scan.setStartRow(startRowKey.getBytes());

String stopRowKey = "18828394827" + (Long.MAX_VALUE - sdf.parse("2016020100000").getTime());

scan.setStopRow(stopRowKey.getBytes());

ResultScanner scanner = hTable.getScanner(scan);

for (Result rs : scanner) {

//rs.getColumnLatestCell("colmun1".getBytes(), "name".getBytes())) 獲取到的數(shù)據(jù)需要經(jīng)過CellUtil.cloneValue在轉(zhuǎn)換成String

System.out.println(new String(CellUtil.cloneValue(rs.getColumnLatestCell("colmun1".getBytes(),

"name".getBytes()))));

}

end();

}

//帶過濾器的查詢

public void scandDB2() throws Exception {

begin();

FilterList list = new FilterList(FilterList.Operator.MUST_PASS_ALL);

PrefixFilter prefixFilter = new PrefixFilter("18827385967".getBytes());

list.addFilter(prefixFilter);

SingleColumnValueExcludeFilter singleColumnValueExcludeFilter = new SingleColumnValueExcludeFilter(

"colmun1".getBytes(), "name".getBytes(), CompareOp.EQUAL, "lillcol".getBytes());

list.addFilter(singleColumnValueExcludeFilter);

Scan scan = new Scan();

scan.setFilter(list);

SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMddHHmmss");

String startRowKey = "18828394827" + (Long.MAX_VALUE - sdf.parse("2016010100000").getTime());

scan.setStartRow(startRowKey.getBytes());

String stopRowKey = "18828394827" + (Long.MAX_VALUE - sdf.parse("2016020100000").getTime());

scan.setStopRow(stopRowKey.getBytes());

ResultScanner scanner = hTable.getScanner(scan);

for (Result rs : scanner) {

System.out.println(new String(CellUtil.cloneValue(rs.getColumnLatestCell("colmun1".getBytes(),

"name".getBytes()))));

}

end();

}

public static void main(String[] args) throws Exception {

HbaseDemo hbaseDemo = new HbaseDemo();

System.out.println("create table main ");

hbaseDemo.createTable();

System.out.println("insert table main ");

hbaseDemo.insertDB();

}

}


11、總結(jié)

由于剛接觸hbase不久 所以如果文中內(nèi)容有錯(cuò)誤的話 歡迎指出 ?謝謝

此外 此文主要是本人學(xué)習(xí)hbase過程中參考尚學(xué)堂教程的一些總結(jié)LА耻蛇!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市胞此,隨后出現(xiàn)的幾起案子臣咖,更是在濱河造成了極大的恐慌,老刑警劉巖漱牵,帶你破解...
    沈念sama閱讀 211,194評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件夺蛇,死亡現(xiàn)場離奇詭異,居然都是意外死亡布疙,警方通過查閱死者的電腦和手機(jī)蚊惯,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評論 2 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來灵临,“玉大人,你說我怎么就攤上這事趴荸∪甯龋” “怎么了?”我有些...
    開封第一講書人閱讀 156,780評論 0 346
  • 文/不壞的土叔 我叫張陵发钝,是天一觀的道長顿涣。 經(jīng)常有香客問我波闹,道長,這世上最難降的妖魔是什么涛碑? 我笑而不...
    開封第一講書人閱讀 56,388評論 1 283
  • 正文 為了忘掉前任精堕,我火速辦了婚禮,結(jié)果婚禮上蒲障,老公的妹妹穿的比我還像新娘歹篓。我一直安慰自己,他們只是感情好揉阎,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,430評論 5 384
  • 文/花漫 我一把揭開白布庄撮。 她就那樣靜靜地躺著,像睡著了一般毙籽。 火紅的嫁衣襯著肌膚如雪洞斯。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,764評論 1 290
  • 那天坑赡,我揣著相機(jī)與錄音烙如,去河邊找鬼。 笑死毅否,一個(gè)胖子當(dāng)著我的面吹牛厅翔,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播搀突,決...
    沈念sama閱讀 38,907評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼刀闷,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了仰迁?” 一聲冷哼從身側(cè)響起甸昏,我...
    開封第一講書人閱讀 37,679評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎徐许,沒想到半個(gè)月后施蜜,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,122評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡雌隅,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,459評論 2 325
  • 正文 我和宋清朗相戀三年翻默,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片恰起。...
    茶點(diǎn)故事閱讀 38,605評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡肯污,死狀恐怖哄芜,靈堂內(nèi)的尸體忽然破棺而出锄奢,到底是詐尸還是另有隱情师坎,我是刑警寧澤胯陋,帶...
    沈念sama閱讀 34,270評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響胞谭,放射性物質(zhì)發(fā)生泄漏伶棒。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,867評論 3 312
  • 文/蒙蒙 一畴蹭、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧幔荒,春花似錦糊闽、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至姚垃,卻和暖如春念链,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背积糯。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評論 1 265
  • 我被黑心中介騙來泰國打工掂墓, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人看成。 一個(gè)月前我還...
    沈念sama閱讀 46,297評論 2 360
  • 正文 我出身青樓君编,卻偏偏與公主長得像,于是被迫代替她去往敵國和親川慌。 傳聞我的和親對象是個(gè)殘疾皇子吃嘿,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,472評論 2 348

推薦閱讀更多精彩內(nèi)容