正文
一,前言
上節講到我們可以用JavaAPI進行Hbase的操作,但是很明顯,Java的API很底層,用起來會很不方便,如果你們學習過Python,可以用Python來對Hbase進行操作。
happybase使用:https://happybase.readthedocs.io/en/latest/user.html#establishing-a-connection
二,包安裝
安裝thrift:https://blog.csdn.net/y472360651/article/details/79050571
安裝happybase
pip install happybase
三,表操作DDL
創建連接:
connection = happybase.Connection('somehost') #鏈接,端口默認是9090 hbase thrift 啟動的默認端口也是9090
列出所有表:
table_name_list = connection.tables() # connection.tables():獲取Hbase實例中的表名列表,返回一個list
獲取表:
table = connection.table(name,user_prefix=True) # connection.table(name,user_prefix=True):獲取一個表對象,返回一個happybase.Table
對象:
- name:表名
- user_prefix:是否使用表前綴,默認為True
禁用表:在做一些刪除操作之前必須先禁用表
connection.disable_table(name) #disable_table(name):禁用表,無返回值
- name:表名
啟用表:
connection.enable_table(name) # enable_table(name):啟用表,無返回值
- name:表名
創建表:
families = { "cf":dict(), "df":dict() } connection.create_table(name,families) # 如果連接時,有傳遞表前綴參數時,真實表名將會是:"{}_{}".format(table_prefix,name)
- name:表名
- families:列族
刪除表:
connection.delete_table(name,disable=False) #delete_table(name,disable=False):刪除表,無返回值 默認是false,若要刪除改為true
- name:表名
- disable:是否先禁用表
四,數據操作DML
若要對表進行數據插入等操作,需要先獲取表實例。
獲取表實例:
table = happybase.Table(name,connection) #happybase.Table(name,connection):獲取表實例
- name:表名
- connection:連接
獲取單元格cells
cells(row, column, versions=None, timestamp=None, include_timestamp=False) # 獲取單元格數據,返回一個list
- row:行
- column:列
- versions:獲取的最大版本數量,默認None,即獲取所有
- timestamp:時間戳,默認None,即獲取所有時間戳版本的數據。可指定一個時間戳,獲取小於此時間戳版本的所有數據
- include_timestamp:是否返回時間戳,默認False
實例:
content = table.cells('row1','cf:1',5,timestamp=1514861929124,include_timestamp=True) print content # [('1', 1514861925674L)]
刪除指定行數據:
delete(row, columns=None, timestamp=None, wal=True):刪除指定行數據,無返回值
- row:行
- columns:列,默認為None,即刪除所有列,可傳入一個list或tuple來指定刪除列
- timestamp:時間戳,默認為None,即刪除所有,可傳入一個時間戳來刪除小於等於此時間戳的所有數據
- wal:是否寫入wal,默認為True
實例:
table.delete(row, columns=None, timestamp=None, wal=True)
插入數據:
put(row, data, timestamp=None, wal=True):插入數據,無返回值
- row: 行
- data: 數據,dict類型,{列:值}構成,列與值皆為str類型
- timestamp:時間戳,默認None,即寫入當前時間戳
- wal:是否寫入wal,默認為True
實例:
# 在row1行,cf:1列插入值1 table.put("row1",{"cf:1":"1"})
獲取一行數據:
row(row, columns=None, timestamp=None, include_timestamp=False):獲取一行數據,返回一個dict
- row:行
- columns: 列,默認為None,即獲取所有列,可傳入一個list或tuple來指定獲取列
- timestamp:時間戳。默認為None,即返回最大的那個時間戳的數據。可傳入一個時間戳來獲取小於此時間戳的最大時間戳的版本數據
- include_timestamp:是否返回時間戳數據,默認為False
實例:
info = table.row(row, columns=None, timestamp=None, include_timestamp=False)
獲取多行數據:
rows(rows, columns=None, timestamp=None, include_timestamp=False):獲取多行數據,返回一個list
- rows:行,可傳入一個list或tuple來指定獲取
- columns: 列,默認為None,即獲取所有列,可傳入一個list或tuple來指定獲取列
- timestamp:時間戳。默認為None,即返回最大的那個時間戳的數據。可傳入一個時間戳來獲取小於此時間戳的最大時間戳的版本數據
- include_timestamp:是否返回時間戳數據,默認為False
實例:
info = table.rows(rows, columns=None, timestamp=None, include_timestamp=False)
獲取掃描器:
scan(row_start=None, row_stop=None, row_prefix=None, columns=None, filter=None,
timestamp=None, include_timestamp=False, batch_size=1000, scan_batching=None, limit=None, sorted_columns=False, reverse=False):獲取一個掃描器,返回一個generator
- row_start:起始行,默認None,即第一行,可傳入行號指定從哪一行開始
- row_stop:結束行,默認None,即最后一行,可傳入行號指定到哪一行結束(不獲取此行數據)
- row_prefix:行號前綴,默認為None,即不指定前綴掃描,可傳入前綴來掃描符合此前綴的行
- columns:列,默認為None,即獲取所有列,可傳入一個list或tuple來指定獲取列
- filter:過濾字符串
- timestamp:時間戳。默認為None,即返回最大的那個時間戳的數據。可傳入一個時間戳來獲取小於此時間戳的最大時間戳的版本數據
- include_timestamp:是否返回時間戳數據,默認為False
- batch_size:用於檢索結果的批量大小
- scan_batching:服務端掃描批處理
- limit:數量
- sorted_columns:是否返回排序的列(根據行名稱排序)
- reverse:是否執行反向掃描
實例:
scanner = table.scan(row_start=None, row_stop=None, row_prefix=None,
columns=None, filter=None, timestamp=None, include_timestamp=False, batch_size=1000, scan_batching=None, limit=None, sorted_columns=False, reverse=False)