python 操作Hbase 詳解


博文參考:https://www.cnblogs.com/tashanzhishi/p/10917956.html

 

如果你們學習過Python,可以用Python來對Hbase進行操作。

happybase使用:https://happybase.readthedocs.io/en/latest/user.html#establishing-a-connection

 

一、Linux下安裝Thrift(一般CDH集群上都會安裝,如未安裝,請參考下面步驟)

0.11.0版本下載地址:http://mirrors.hust.edu.cn/apache/thrift/0.11.0/thrift-0.11.0.tar.gz

執行如下命令安裝Thrift依賴:

yum install automake bison flex g++ git libboost1.55 libevent-dev libssl-dev libtool make pkg-config

tar -zxvf thrift-0.11.0.tar.gz
cd thrift-0.11.0
./configure --with-cpp --with-boost --with-python --without-csharp --with-java --without-erlang --without-perl --with-php --without-php_extension --without-ruby --without-haskell  --without-go
make
make install
在Master中Hbase安裝目錄下的bin目錄啟動thrift服務:

./hbase-daemon.sh start thrift

 

二、安裝 happybase 包

pip install happybase

 

三、表操作DDL

創建連接:

connection = happybase.Connection('192.168.3.45',port=9090)        #鏈接,端口默認是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
若要對表進行數據插入等操作,需要先獲取表實例。
獲取表實例:

connection = happybase.Connection('192.168.3.45',port=9090)
connection.open()
table = connection.table('cmis:intf_trade_log_tmp')

 

獲取單元格cells

cells(row, column, versions=None, timestamp=None, include_timestamp=False)  # 獲取單元格數據,返回一個list
row:行
column:列
versions:獲取的最大版本數量,默認None,即獲取所有
timestamp:時間戳,默認None,即獲取所有時間戳版本的數據。可指定一個時間戳,獲取小於此時間戳版本的所有數據
include_timestamp:是否返回時間戳,默認False

content = table.cells('00033015017DC6537E4ECEEB3351C183','pk_value:id_no')
print content

["'422202199108263422'"]


刪除指定行數據:

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)

 

《記錄一下》

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM