5. 新增、更新數(shù)據(jù)Put
5.1.常用構造函數(shù):
(1)指定行鍵
public Put(byte[] row)
參數(shù):row 行鍵
(2)指定行鍵和時間戳
public Put(byte[] row, long ts)
參數(shù):row 行鍵,ts 時間戳
(3)從目標字符串中提取子串,作為行鍵
Put(byte[] rowArray, int rowOffset, int rowLength)
(4)從目標字符串中提取子串,作為行鍵,并加上時間戳
Put(byte[] rowArray, int rowOffset, int rowLength, long ts)
5.2.常用方法:
(1)指定列族、限定符,添加值
add(byte[] family, byte[] qualifier, byte[] value)
(2)指定列族、限定符、時間戳,添加值
add(byte[] family, byte[] qualifier, long ts, byte[] value)
(3)設置寫WAL(Write-Ahead-Log)的級別
public void setDurability(Durability d)
參數(shù)是一個枚舉值,可以有以下幾種選擇:
ASYNC_WAL : 當數(shù)據(jù)變動時,異步寫WAL日志
SYNC_WAL : 當數(shù)據(jù)變動時,同步寫WAL日志
FSYNC_WAL : 當數(shù)據(jù)變動時,同步寫WAL日志,并且,強制將數(shù)據(jù)寫入磁盤
SKIP_WAL : 不寫WAL日志
USE_DEFAULT : 使用HBase全局默認的WAL寫入級別,即SYNC_WAL
5.3.實例代碼
(1)插入行
Configuration conf = HBaseConfiguration.create();
HTable table = new HTable(conf, “rd_ns:leetable”);
Put put = new Put(Bytes.toBytes(“100001”));
put.add(Bytes.toBytes(“info”), Bytes.toBytes(“name”), Bytes.toBytes(“l(fā)ion”));
put.add(Bytes.toBytes(“info”), Bytes.toBytes(“address”), Bytes.toBytes(“shangdi”));
put.add(Bytes.toBytes(“info”), Bytes.toBytes(“age”), Bytes.toBytes(“30”));
put.setDurability(Durability.SYNC_WAL);
table.put(put);
table.close();
(2)更新行
Configuration conf = HBaseConfiguration.create();
HTable table = new HTable(conf, “rd_ns:leetable”);
Put put = new Put(Bytes.toBytes(“100001”));
put.add(Bytes.toBytes(“info”), Bytes.toBytes(“name”), Bytes.toBytes(“l(fā)ee”));
put.add(Bytes.toBytes(“info”), Bytes.toBytes(“address”), Bytes.toBytes(“l(fā)ongze”));
put.add(Bytes.toBytes(“info”), Bytes.toBytes(“age”), Bytes.toBytes(“31”));
put.setDurability(Durability.SYNC_WAL);
table.put(put);
table.close();
注意:
Put的構造函數(shù)都需要指定行鍵,如果是全新的行鍵,則新增一行;如果是已有的行鍵,則更新現(xiàn)有行。
創(chuàng)建Put對象及put.add過程都是在構建一行的數(shù)據(jù),創(chuàng)建Put對象時相當于創(chuàng)建了行對象,add的過程就是往目標行里添加cell,直到table.put才將數(shù)據(jù)插入表格;
以上代碼創(chuàng)建Put對象用的是構造函數(shù)1,也可用構造函數(shù)2,第二個參數(shù)是時間戳;
Put還有別的構造函數(shù),請查閱官網(wǎng)API。
(3)從目標字符串中提取子串,作為行鍵,構建Put
Configuration conf = HBaseConfiguration.create();
HTable table = new HTable(conf, “rd_ns:leetable”);
Put put = new Put(Bytes.toBytes(“100001_100002”),7,6);
put.add(Bytes.toBytes(“info”), Bytes.toBytes(“name”), Bytes.toBytes(“show”));
put.add(Bytes.toBytes(“info”), Bytes.toBytes(“address”), Bytes.toBytes(“caofang”));
put.add(Bytes.toBytes(“info”), Bytes.toBytes(“age”), Bytes.toBytes(“30”));
table.put(put);
table.close();
注意,關于:Put put = new Put(Bytes.toBytes(“100001_100002”),7,6)
第二個參數(shù)是偏移量,也就是行鍵從第一個參數(shù)的第幾個字符開始截??;
第三個參數(shù)是截取長度;
這個代碼實際是從 100001_100002 中截取了100002子串作為目標行的行鍵。
6.刪除數(shù)據(jù)Delete
Delete類用于刪除表中的一行數(shù)據(jù),通過HTable.delete來執(zhí)行該動作。
在執(zhí)行Delete操作時,HBase并不會立即刪除數(shù)據(jù),而是對需要刪除的數(shù)據(jù)打上一個“墓碑”標記,直到當Storefile合并時,再清除這些被標記上“墓碑”的數(shù)據(jù)。
如果希望刪除整行,用行鍵來初始化一個Delete對象即可。如果希望進一步定義刪除的具體內容,可以使用以下這些Delete對象的方法:
為了刪除指定的列族,可以使用deleteFamily
為了刪除指定列的多個版本,可以使用deleteColumns
為了刪除指定列的指定版本,可以使用deleteColumn,這樣的話就只會刪除版本號(時間戳)與指定版本相同的列。如果不指定時間戳,默認只刪除最新的版本
下面詳細說明構造函數(shù)和常用方法:
6.1.構造函數(shù)
(1)指定要刪除的行鍵
Delete(byte[] row)
刪除行鍵指定行的數(shù)據(jù)。
如果沒有進一步的操作,使用該構造函數(shù)將刪除行鍵指定的行中所有列族中所有列的所有版本!
(2)指定要刪除的行鍵和時間戳
Delete(byte[] row, long timestamp)
刪除行鍵和時間戳共同確定行的數(shù)據(jù)。
如果沒有進一步的操作,使用該構造函數(shù)將刪除行鍵指定的行中,所有列族中所有列的時間戳小于等于指定時間戳的數(shù)據(jù)版本。
注意:該時間戳僅僅和刪除行有關,如果需要進一步指定列族或者列,你必須分別為它們指定時間戳。
(3)給定一個字符串,目標行鍵的偏移,截取的長度
Delete(byte[] rowArray, int rowOffset, int rowLength)
(4)給定一個字符串,目標行鍵的偏移,截取的長度,時間戳
Delete(byte[] rowArray, int rowOffset, int rowLength, long ts)
6.2.常用方法
Delete deleteColumn(byte[] family, byte[] qualifier) 刪除指定列的最新版本的數(shù)據(jù)。
Delete deleteColumns(byte[] family, byte[] qualifier) 刪除指定列的所有版本的數(shù)據(jù)。
Delete deleteColumn(byte[] family, byte[] qualifier, long timestamp) 刪除指定列的指定版本的數(shù)據(jù)。
Delete deleteColumns(byte[] family, byte[] qualifier, long timestamp) 刪除指定列的,時間戳小于等于給定時間戳的所有版本的數(shù)據(jù)。
Delete deleteFamily(byte[] family) 刪除指定列族的所有列的所有版本數(shù)據(jù)。
Delete deleteFamily(byte[] family, long timestamp) 刪除指定列族的所有列中時間戳小于等于指定時間戳的所有數(shù)據(jù)。
Delete deleteFamilyVersion(byte[] family, long timestamp) 刪除指定列族中所有列的時間戳等于指定時間戳的版本數(shù)據(jù)。
voidsetTimestamp(long timestamp) 為Delete對象設置時間戳。
6.3.實例代碼
(1)刪除整行的所有列族、所有行、所有版本
Configuration conf = HBaseConfiguration.create();
HTable table = new HTable(conf, “rd_ns:leetable”);
Delete delete = new Delete(Bytes.toBytes(“000”));
table.delete(delete);
table.close();
(2)刪除指定列的最新版本
以下是刪除之前的數(shù)據(jù),注意看100003行的info:address,這是該列最新版本的數(shù)據(jù),值是caofang1,在這之前的版本值是caofang:
hbase(main):007:0》 scan ‘rd_ns:leetable’
ROW COLUMN+CELL
100001 column=info:address, timestamp=1405304843114, value=longze
100001 column=info:age, timestamp=1405304843114, value=31
100001 column=info:name, timestamp=1405304843114, value=leon
100002 column=info:address, timestamp=1405305471343, value=caofang
100002 column=info:age, timestamp=1405305471343, value=30
100002 column=info:name, timestamp=1405305471343, value=show
100003 column=info:address, timestamp=1405390959464, value=caofang1
100003 column=info:age, timestamp=1405390959464, value=301
100003 column=info:name, timestamp=1405390959464, value=show1
3 row(s) in 0.0270 seconds
執(zhí)行以下代碼:
Configuration conf = HBaseConfiguration.create();
HTable table = new HTable(conf, “rd_ns:leetable”);
Delete delete = new Delete(Bytes.toBytes(“100003”));
delete.deleteColumn(Bytes.toBytes(“info”), Bytes.toBytes(“address”));
table.delete(delete);
table.close();
然后查看數(shù)據(jù),發(fā)現(xiàn)100003列的info:address列的值顯示為前一個版本的caofang了!其余值均不變:
hbase(main):008:0》 scan ‘rd_ns:leetable’
ROW COLUMN+CELL
100001 column=info:address, timestamp=1405304843114, value=longze
100001 column=info:age, timestamp=1405304843114, value=31
100001 column=info:name, timestamp=1405304843114, value=leon
100002 column=info:address, timestamp=1405305471343, value=caofang
100002 column=info:age, timestamp=1405305471343, value=30
100002 column=info:name, timestamp=1405305471343, value=show
100003 column=info:address, timestamp=1405390728175, value=caofang
100003 column=info:age, timestamp=1405390959464, value=301
100003 column=info:name, timestamp=1405390959464, value=show1
3 row(s) in 0.0560 seconds
(3)刪除指定列的所有版本
接以上場景,執(zhí)行以下代碼:
Configuration conf = HBaseConfiguration.create();
HTable table = new HTable(conf, “rd_ns:leetable”);
Delete delete = new Delete(Bytes.toBytes(“100003”));
delete.deleteColumns(Bytes.toBytes(“info”), Bytes.toBytes(“address”));
table.delete(delete);
table.close();
然后我們會發(fā)現(xiàn),100003行的整個info:address列都沒了:
hbase(main):009:0》 scan ‘rd_ns:leetable’
ROW COLUMN+CELL
100001 column=info:address, timestamp=1405304843114, value=longze
100001 column=info:age, timestamp=1405304843114, value=31
100001 column=info:name, timestamp=1405304843114, value=leon
100002 column=info:address, timestamp=1405305471343, value=caofang
100002 column=info:age, timestamp=1405305471343, value=30
100002 column=info:name, timestamp=1405305471343, value=show
100003 column=info:age, timestamp=1405390959464, value=301
100003 column=info:name, timestamp=1405390959464, value=show1
3 row(s) in 0.0240 seconds
(4)刪除指定列族中所有列的時間戳等于指定時間戳的版本數(shù)據(jù)
為了演示效果,我已經(jīng)向100003行的info:address列新插入一條數(shù)據(jù)
hbase(main):010:0》 scan ‘rd_ns:leetable’
ROW COLUMN+CELL
100001 column=info:address, timestamp=1405304843114, value=longze
100001 column=info:age, timestamp=1405304843114, value=31
100001 column=info:name, timestamp=1405304843114, value=leon
100002 column=info:address, timestamp=1405305471343, value=caofang
100002 column=info:age, timestamp=1405305471343, value=30
100002 column=info:name, timestamp=1405305471343, value=show
100003 column=info:address, timestamp=1405391883886, value=shangdi
100003 column=info:age, timestamp=1405390959464, value=301
100003 column=info:name, timestamp=1405390959464, value=show1
3 row(s) in 0.0250 seconds
現(xiàn)在,我們的目的是刪除info列族中,時間戳為1405390959464的所有列數(shù)據(jù):
Configuration conf = HBaseConfiguration.create();
HTable table = new HTable(conf, “rd_ns:leetable”);
Delete delete = new Delete(Bytes.toBytes(“100003”));
delete.deleteFamilyVersion(Bytes.toBytes(“info”), 1405390959464L);
table.delete(delete);
table.close();
hbase(main):011:0》 scan ‘rd_ns:leetable’
ROW COLUMN+CELL
100001 column=info:address, timestamp=1405304843114, value=longze
100001 column=info:age, timestamp=1405304843114, value=31
100001 column=info:name, timestamp=1405304843114, value=leon
100002 column=info:address, timestamp=1405305471343, value=caofang
100002 column=info:age, timestamp=1405305471343, value=30
100002 column=info:name, timestamp=1405305471343, value=show
100003 column=info:address, timestamp=1405391883886, value=shangdi
100003 column=info:age, timestamp=1405390728175, value=30
100003 column=info:name, timestamp=1405390728175, value=show
3 row(s) in 0.0250 seconds
可以看到,100003行的info列族,已經(jīng)不存在時間戳為1405390959464的數(shù)據(jù),比它更早版本的數(shù)據(jù)被查詢出來,而info列族中時間戳不等于1405390959464的address列,不受該delete的影響。
評論
查看更多