hbase
是一款分佈式數據庫. 其對數據的索引只通過row key
進行. 在存儲數據的時候, 通過row key
的排序進行存儲. 在面對一個新的數據庫時, 深究其原理並不知一個明智的選擇, 正如開車一般, 大多數人都是先學會開車, 然後在開車的過程中車子出故障了, 再慢慢學着去修理. 不管怎麼說, 第一步都是要先會使用.
這篇文章主要爲了整理hbase
命令行的使用, 留待以後用到時翻閱.
讀取數據
因爲一個數據庫使用, 通常最複雜的命令就是查詢, 故而將大篇幅都給了查詢. 哦對, 如果你現在還沒有數據, 先跳到文章底部, 那裏有建表和數據插入的操作.
hbase
沒有索引, 訪問hbase
中的數據只有三種方式:
- 通過指定
row key
訪問 - 通過
row key
範圍訪問 - 全表掃描
單條數據查詢
get '<table name>','<row key>'
: 查詢一行數據get '<table name>','<row key>','<column family>'
: 查詢一行數據, 返回指定列族數據
全表掃描
scan '<table name>'
: 返回全表數據scan '<table name>,{COLUMN=>'<column family>'}
: 返回全表指定列族數據scan '<table name>,{COLUMNS=>['<column family:key']}
: 返回全表指定列族的一個 key
到這裏, 有沒有對大括號中的屬性值感興趣? 其可以添加一些指定的過濾條件
數據過濾屬性
這些內容, 不光可以在scan
命令使用, 在count
, get
都可以用. 有一些暫時認爲用不到的就直接忽略了, 可以通過help 'scan'
查看支持的所有屬性. 其使用如下:
{屬性1=>'值1, 屬性2=>'值2'}
字段過濾
COLUMN
: 返回指定列族'<column family>'
COLUMNS
: 返回指定列族的一列'<column family:key>'
數量限制
LIMIT
: 限制返回結果數量
row key 過濾
STARTROW
: 限定掃描 row key 起始行STOPROW
: 限定掃描 row key 結束行ROWPREFIXFILTER
: row key 前綴匹配
排序
REVERSED
: row key 倒序掃描- TRUE/FALSE
其他
VERSIONS
: (int)返回多個版本的數據ALL_METRICS
: (bool)是否顯示掃描的指標數據METRICS
: 查看指定指標數據["<xxx>"]
CACHE
: (int)指定每次要緩存多少條數據, 可加速查詢MAXLENGTH
:(int) 指定返回數據的最大長度(可以用來限制返回超長的數據)
條件過濾
TIMERANGE
: 限定時間戳範圍[1303668804000, 1303668904000]
(毫秒, 前閉後開)
TIMESTAMP
: 指定時間的數據FILTER
: 對結果進行過濾
對FILTER
進行額外的補充介紹
過濾條件可添加多個, 如:
`FILTER=>"fun1() and (fun2() or fun3())"
你要是想問我文檔在哪裏?? 不好意思, 沒找到. 不過經過我多方嘗試, 發現這些方法都是hbase
官方jar
包中實現的過濾功能, 也就是說, 如果你是用JAVA
開發, 那就可以自己寫過濾器.
不過雖然沒有找到官方文檔, 我還是另闢蹊徑找到了所有可用的過濾器. 沒錯, 就是去看jar
包的內容. 看到這個過濾器的父類是: FilterBase
. 進而找到所有在org.apache.hadoop.hbase.filter
包下的實現類:
各個過濾器的參數, 可看其各自的構造方法. 簡單列一下其中可用的方法:
row key 過濾
PrefixFilter
: row key 前綴匹配PrefixFilter('test')
: 匹配所有'test'開頭的row key
FuzzyRowFilter
: row key 中間匹配(不支持命令行, 可通過RowFilter
正則實現)RowFilter
: 對 row key 進行比較RowFilter(op, value)
: 參數參考SingleColumnValueFilter
列名過濾
ColumnPrefixFilter
: 列族下的 key 前綴匹配ColumnPrefixFilter('test')
: 匹配所有'test'開頭的 key
MultipleColumnPrefixFilter
: 與ColumnPrefixFilter
作用類似, 不過可以匹配多個, 相當於多個ColumnPrefixFilter
的或操作MultipleColumnPrefixFilter('test1', 'test2')
ColumnRangeFilter
: 列名區間匹配(比如一行數據有一萬列, 返回其中部分). 字符串比較ColumnRangeFilter(minColumn, minColumnInclusive, maxColumn, maxColumnInclusive)
minColumn
: 最小的列(string). max同理minColumnInclusive
: 是否包含最小列(bool). max 同理
DependentColumnFilter
: 返回存在的匹配列(判斷是否存在). (僅返回匹配列)DependentColumnFilter(family, qualifier)
QualifierFilter
: 對列名進行匹配過濾QualifierFilter(op, value)
: 參數參考ColumnValueFilter
列值過濾
SingleColumnValueFilter
: 對列值進行比較過濾. 大於小於等於ColumnValueFilter(family, qualifier, op, value)
family
: 列族名稱qualifier
: 列名op
: =, !=, >, <, <=, >=...value
: 進行比較的值substring:xxx
: 字符串前綴比較 (只能使用=/!=)regexstring:xxx
: 字符串正則比較(只能使用=/!=)binary:xxx
: 字典序比較binaryprefix:xxx
: 字典序前綴比較
SingleColumnValueExcludeFilter
: 參數與功能與SingleColumnValueFilter
相同. 不同點在於, 此方法返回時會去掉比較的列.ColumnValueFilter
: 與SingleColumnValueFilter
類似. 唯一不同的是, 此過濾器只返回匹配的列. 而SingleColumnValueFilter
會返回整行數據KeyOnlyFilter
: 只返回列名, 不返回其對應的值(無參)TimestampsFilter
: 按照時間戳進行過濾, 返回指定時間戳的數據.TimestampsFilter(time1, time2)
ValueFilter
: 對值進行匹配, 僅返回匹配列. 參數參考SingleColumnValueFilter
*ValueFilter(op, value)
數量過濾
ColumnCountGetFilter
: 返回每行的前 n 個列ColumnCountGetFilter(limit)
ColumnPaginationFilter
: 返回每行n-m 列數據ColumnPaginationFilter(limit, offset)
: 數量限制/偏移量
FilterAllFilter
: 過濾所有內容. 不給客戶端返回任何數據, 沒有參數. 這有什麼用(用來檢查性能???)FirstKeyOnlyFilter
: 返回每行的第一個鍵值, 沒有參數. (用來統計??)InclusiveStopFilter
: 提前結束遍歷. 當遇到匹配的 row key時停止.InclusiveStopFilter(stopRowKey)
PageFilter
: 限定返回一頁的數據行數. 這玩意不就是 limit 麼...PageFilter(size)
RandomRowFilter
: 返回隨機數據, 無參. (shell 不支持)
另外, 還有一些過濾器不支持命令行使用, 一些複雜參數的構造方法. 就暫時被我忽略了.
腳本查詢
另外, 其命令行更厲害的一點是, 他可以直接執行 JAVA
代碼, 而, 不對, 應該是類JAVA
代碼.
比如: import org.apache.hadoop.hbase.filter.SingleColumnValueFilter
再比如: filter = SingleColumnValueFilter.new(Bytes.toBytes('user_info'), Bytes.toBytes('name'), CompareFilter::CompareOp.valueOf('EQUAL'),Bytes.toBytes('substring:xxx'))
再比如: scan 'user', {FILTER => filter, LIMIT => 2}
而且, 這些命令都是可以直接跑在命令行的. 同時, 你也可以自己建一些腳本交給shel
執行:
hbase shell cron.txt
shell
會依次執行文件中的命令. 這裏還沒有深究, 先簡單記錄一下有這麼個事.
其他命令
count '<table name>'
: 查看記錄總數status
: 查看服務器狀態version
: 查看版本list
: 查看所有表help '<command name'
: 查詢指定命令的幫助信息
表結構相關:
create '<table name>','<column family1>','<column family2>',...
: 建表describe '<table name>'
: 查看錶的描述信息alter '<table name>', '<column family>'
: 增加一個列族alter '<table name>', {NAME => '<column family>', METHOD => 'delete’}
: 刪除一個列族is_enabled '<table name>'
: 查看錶是否啓用is_disabled '<table name>'
: 查看錶是否禁用enabled '<table name>'
: 啓用表disabled '<table name>'
: 禁用表exists '<table name>'
: 查看錶是否存在drop '<table name>'
: 刪除表(需要先禁用)
數據相關:
put '<table name>','<row key>','<column family:key>','<value>'
: 插入數據delete '<table name>', '<row key>','<column family:key>',<timestamp>
: 刪除數據(也可以不帶時間戳, 刪除所有版本)deleteall '<table name>', '<row key>'
: 刪除一行數據