一、起因:
Hbase是一個列式存儲,nosql類型的數據庫,類似mongodb。
目前似乎沒有提供批量刪除的方法,只有一個單行刪除的命令:deleteall 'tablename', rowkey
二、刪除方法:
方法一:通過寫 shell 腳本,從 hbase shell 查出需要刪除的 rowkey ,拼成刪除命令(deleteall 'tablename', rowkey),寫到文本 del_temp.txt ;然后執行 hbase shell del_temp.txt
方法二:通過建映射表,比如在 hive 建一個映射表,然后寫 hql 查出需要刪除的 rowkey ,拼成刪除命令(deleteall 'tablename', rowkey),寫到文本 del_temp.txt ;然后執行 hbase shell del_temp.txt
方法三:通過python/ java 代碼,調用 hbase 的單行刪除方法,寫個循環刪除
方法四:通過建映射表,比如在 hive 建一個映射表,將 需要保留的數據 通過 hql 查詢出來,備份到 hive 的一張臨時表 ;然后 在hbase shell 里面 執行 truncate 'tablename' ,清空 hbase 的數據; 最后 在將數據 從 hive 的備份表 讀出來,插入 映射表,寫回 hbase;
總結:
前面3種方法,本質上都是在 hbase 中逐行刪除;而第4種方法,是利用hive的map reduce倒數據。對於不熟悉 hbase 和 java 語法的開發人員而言,使用24方法,是靈活性最好的。
三、代碼:
假設hbase有一張表,表名:test_turboway,列族:cf,以第二種刪除方法為例:
1、hive 建映射表:
CREATE EXTERNAL TABLE edw.test_turboway_hbase( `keyid` string COMMENT 'from deserializer', `title` string COMMENT 'from deserializer', `bizdate` string COMMENT 'from deserializer', `loginid` string COMMENT 'from deserializer') ROW FORMAT SERDE 'org.apache.hadoop.hive.hbase.HBaseSerDe' STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler' WITH SERDEPROPERTIES ( 'hbase.columns.mapping'=':key,cf:title,cf:bizdate,cf:loginid', 'serialization.format'='1') TBLPROPERTIES ( 'COLUMN_STATS_ACCURATE'='false', 'hbase.table.name'='test_turboway', 'numFiles'='0', 'numRows'='-1', 'rawDataSize'='-1', 'totalSize'='0', 'transient_lastDdlTime'='1543297130')
2、記錄hive查詢要刪除的數據,拼成命令:
hive -e "select concat('deleteall \'test_turboway\',\'',keyid,'\'') from edw.test_turboway_hbase where loginid = '20181122'" > del_temp.txt && echo 'exit' >> del_temp.txt
3、hbase shell 執行刪除命令
hbase shell del_temp.txt > del.log
