HBase 命令行

hbase是一款分佈式數據庫. 其對數據的索引只通過row key進行. 在存儲數據的時候, 通過row key的排序進行存儲. 在面對一個新的數據庫時, 深究其原理並不知一個明智的選擇, 正如開車一般, 大多數人都是先學會開車, 然後在開車的過程中車子出故障了, 再慢慢學着去修理. 不管怎麼說, 第一步都是要先會使用.

這篇文章主要爲了整理hbase命令行的使用, 留待以後用到時翻閱.

讀取數據

因爲一個數據庫使用, 通常最複雜的命令就是查詢, 故而將大篇幅都給了查詢. 哦對, 如果你現在還沒有數據, 先跳到文章底部, 那裏有建表和數據插入的操作.

hbase沒有索引, 訪問hbase中的數據只有三種方式:

  1. 通過指定row key訪問
  2. 通過row key範圍訪問
  3. 全表掃描

單條數據查詢

  • 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包下的實現類:

image-20201203122154796

各個過濾器的參數, 可看其各自的構造方法. 簡單列一下其中可用的方法:

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>': 刪除一行數據
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章