5. 新增、更新數據Put
5.1.常用構造函數:
(1)指定行鍵
public Put(byte[] row)
參數:row 行鍵
(2)指定行鍵和時間戳
public Put(byte[] row, long ts)
參數: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)
參數是一個枚舉值,可以有以下幾種選擇:
ASYNC_WAL : 當數據變動時,異步寫WAL日志
SYNC_WAL : 當數據變動時,同步寫WAL日志
FSYNC_WAL : 當數據變動時,同步寫WAL日志,并且,強制將數據寫入磁盤
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(“lion”));
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(“lee”));
put.add(Bytes.toBytes(“info”), Bytes.toBytes(“address”), Bytes.toBytes(“longze”));
put.add(Bytes.toBytes(“info”), Bytes.toBytes(“age”), Bytes.toBytes(“31”));
put.setDurability(Durability.SYNC_WAL);
table.put(put);
table.close();
注意:
Put的構造函數都需要指定行鍵,如果是全新的行鍵,則新增一行;如果是已有的行鍵,則更新現有行。
創建Put對象及put.add過程都是在構建一行的數據,創建Put對象時相當于創建了行對象,add的過程就是往目標行里添加cell,直到table.put才將數據插入表格;
以上代碼創建Put對象用的是構造函數1,也可用構造函數2,第二個參數是時間戳;
Put還有別的構造函數,請查閱官網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)
第二個參數是偏移量,也就是行鍵從第一個參數的第幾個字符開始截取;
第三個參數是截取長度;
這個代碼實際是從 100001_100002 中截取了100002子串作為目標行的行鍵。
6.刪除數據Delete
Delete類用于刪除表中的一行數據,通過HTable.delete來執行該動作。
在執行Delete操作時,HBase并不會立即刪除數據,而是對需要刪除的數據打上一個“墓碑”標記,直到當Storefile合并時,再清除這些被標記上“墓碑”的數據。
如果希望刪除整行,用行鍵來初始化一個Delete對象即可。如果希望進一步定義刪除的具體內容,可以使用以下這些Delete對象的方法:
為了刪除指定的列族,可以使用deleteFamily
為了刪除指定列的多個版本,可以使用deleteColumns
為了刪除指定列的指定版本,可以使用deleteColumn,這樣的話就只會刪除版本號(時間戳)與指定版本相同的列。如果不指定時間戳,默認只刪除最新的版本
下面詳細說明構造函數和常用方法:
6.1.構造函數
(1)指定要刪除的行鍵
Delete(byte[] row)
刪除行鍵指定行的數據。
如果沒有進一步的操作,使用該構造函數將刪除行鍵指定的行中所有列族中所有列的所有版本!
(2)指定要刪除的行鍵和時間戳
Delete(byte[] row, long timestamp)
刪除行鍵和時間戳共同確定行的數據。
如果沒有進一步的操作,使用該構造函數將刪除行鍵指定的行中,所有列族中所有列的時間戳小于等于指定時間戳的數據版本。
注意:該時間戳僅僅和刪除行有關,如果需要進一步指定列族或者列,你必須分別為它們指定時間戳。
(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) 刪除指定列的最新版本的數據。
Delete deleteColumns(byte[] family, byte[] qualifier) 刪除指定列的所有版本的數據。
Delete deleteColumn(byte[] family, byte[] qualifier, long timestamp) 刪除指定列的指定版本的數據。
Delete deleteColumns(byte[] family, byte[] qualifier, long timestamp) 刪除指定列的,時間戳小于等于給定時間戳的所有版本的數據。
Delete deleteFamily(byte[] family) 刪除指定列族的所有列的所有版本數據。
Delete deleteFamily(byte[] family, long timestamp) 刪除指定列族的所有列中時間戳小于等于指定時間戳的所有數據。
Delete deleteFamilyVersion(byte[] family, long timestamp) 刪除指定列族中所有列的時間戳等于指定時間戳的版本數據。
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)刪除指定列的最新版本
以下是刪除之前的數據,注意看100003行的info:address,這是該列最新版本的數據,值是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
執行以下代碼:
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();
然后查看數據,發現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)刪除指定列的所有版本
接以上場景,執行以下代碼:
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();
然后我們會發現,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)刪除指定列族中所有列的時間戳等于指定時間戳的版本數據
為了演示效果,我已經向100003行的info:address列新插入一條數據
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
現在,我們的目的是刪除info列族中,時間戳為1405390959464的所有列數據:
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列族,已經不存在時間戳為1405390959464的數據,比它更早版本的數據被查詢出來,而info列族中時間戳不等于1405390959464的address列,不受該delete的影響。
評論
查看更多