zoukankan      html  css  js  c++  java
  • 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)

    《记录一下》

  • 相关阅读:
    python实战===短信验证码的小项目
    pillow模块的学习
    安全测试===8大前端安全问题(下)
    安全测试===8大前端安全问题(上)
    移动端测试===Android内存泄露和GC机制(转)
    识别验证码
    网址
    自动化测试===Macaca环境搭建,自我总结
    linux===Ubuntu修改设备名称
    macaca安装失败的解决办法!
  • 原文地址:https://www.cnblogs.com/hello-wei/p/11936764.html
Copyright © 2011-2022 走看看