• 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)

    《记录一下》

  • 相关阅读:
    动态传参
    函数的介绍
    文件的操作
    send email with formatted table
    minimize and close window with customed winform
    python algorithm
    something important about docker
    book list
    which language is suitable for what to do
    Find Duplicate Items in list fast
  • 原文地址:https://www.cnblogs.com/hello-wei/p/11936764.html
走看看 - 开发者的网上家园