zoukankan      html  css  js  c++  java
  • Hbase基础(二十一):python操作hbase之happybase

    来源:https://blog.csdn.net/qq_43279457/article/details/109137470

    happybase官方文档:https://happybase.readthedocs.io/en/latest/api.html#

    0 hbase准备

    0.1 使用happybase库操作hbase
    先安装该库 pip install happybase

    0.2 然后确保 hadoop 和 hbase 可用并开启
    能进行hdfs操作就代表hadoop正常运行
    能在 hbase shell 下使用 list 命令并不报错就代表能正常运行
    0.3 开启thrift
    使用命令开启

    $HBASE_HOME/bin/hbase-daemon.sh start thrift

    使用命令 jps 查看是否开启成功

    1 连接hbase

    1. 连接操作
    import happybase
    
    con = happybase.Connection('192.168.31.105')
    con.open()  # 打开传输
    print(con.tables())  # 输出所有表名
    con.close()  # 关闭传输

    进入Connection对象中,左边列出了许多Connection对象中可以操作的函数,这些函数能在表级上操作表,如创建表,禁用表,删除表(hbase中要先禁用表后才能删除表),创建表对象等

     其中最常用的是创建表对象,table函数就是创建表对象,定位到table函数这里,发现他返回的是Table()对象,继续跟进Table对象

     左边是Table对象下的函数,里边有查看单元格,查看列,删除数据,创建数据等。

    2 表操作

    2.1 创建表

    import happybase
    
    con = happybase.Connection('192.168.31.105')  # 默认9090端口
    con.open()  # 打开thrift传输,TCP连接
    
    families = {
        'wangzherongyao': dict(max_versions=2),  # 设置最大版本为2
        'hepingjingying': dict(max_versions=1, block_cache_enabled=False),
        'xiaoxiaole': dict(),  # 使用默认值.版本默认为3
    }
    con.create_table('games', families)  # games是表名,families是列簇,列簇使用字典的形式表示,每个列簇要添加配置选项,配置选项也要用字典表示
    
    print(con.tables())

    配置选项:

    max_versions (int类型)
    compression (str类型)
    in_memory (bool类型)
    bloom_filter_type (str类型)
    bloom_filter_vector_size (int类型)
    bloom_filter_nb_hashes (int类型)
    block_cache_enabled (bool类型)
    time_to_live (int类型)

    2.2 启动或禁用表

    要设置或者删除表时,必须得先禁用表,再删除。只能禁用或启动一次,不能重复,否则报错。

    # 禁用表
    import happybase
    
    con = happybase.Connection('192.168.31.105')  # 默认9090端口
    con.open()  # 打开thrift传输,TCP连接
    
    con.disable_table('games')  # 禁用表,games代表表名
    print(con.is_table_enabled('games'))  # 查看表的状态,False代表禁用,True代表启动
    print(con.tables())  # 即使禁用了该表,该表还是存在的,只是状态改变了
    
    con.close()  # 关闭传输
    # 启动表
    import happybase
    
    con = happybase.Connection('192.168.31.105')  # 默认9090端口
    con.open()  # 打开thrift传输,TCP连接
    
    con.enable_table('games')  # 启动该表
    print(con.is_table_enabled('games'))  # 查看表的状态,False代表禁用,True代表启动
    print(con.tables())  # 即使禁用了该表,该表还是存在的,只是状态改变了
    
    con.close()  # 关闭传输

    2.3 删除表

    删除一个表要先将该表禁用,之后才能删除。下面的delete_table函数不但可以禁用表还可以删除表。如果前面已经禁用了该表,delete_table函数就可以不用加第二个参数,默认为False

    import happybase
    
    con = happybase.Connection('192.168.31.105')  # 默认9090端口
    con.open()  # 打开thrift传输,TCP连接
    
    con.delete_table('games', disable=True)  # 第一个参数表名,第二个参数表示是否禁用该表
    
    print(con.tables())

    3.数据操作

    3.1 建立数据

    这里向单元格写一个数据。

    注意:如果写数据时没有这个列名,就新建这样的列名,再写数据。

    在 hbase shell 中,使用put命令,一次只能写入一个单元格,而happybase库的put函数能写入多个。

    import happybase
    
    con = happybase.Connection('192.168.31.105')  # 默认9090端口
    con.open()  # 打开传输
    
    biao = con.table('games')  # games是表名,table('games')获取某一个表对象
    
    wangzhe = {
        'wangzherongyao:名字': '别出大辅助',
        'wangzherongyao:等级': '30',
        'wangzherongyao:段位': '最强王者',
    }
    biao.put('0001', wangzhe)  # 提交数据,0001代表行键,写入的数据要使用字典形式表示
    
    # 下面是查看信息,如果不懂可以继续看下一个
    one_row = biao.row('0001')  # 获取一行数据,0001是行键
    for value in one_row.keys():  # 遍历字典
        print(value.decode('utf-8'), one_row[value].decode('utf-8'))  # 可能有中文,使用encode转码
    
    con.close()  # 关闭传输

    3.2 查看操作

    下面连接之后,就创建一个表对象,然后对这个表对象进行操作,这里演示了多种查看操作,第一个是查看一行的数据,第二个是查看一个单元格的数据,因为我存储时使用了中文,在hbase中存储的不是中文,而是utf-8的编码,这里接收了hbase传过来的编码数据之后对它进行解码,第三个是获取多行的数据,第四个是使用扫描器获取整个表的数据。

    import happybase
    
    con = happybase.Connection('192.168.31.105')  # 默认9090端口
    con.open()  # 打开传输
    
    biao = con.table('games')  # games是表名,table('games')获取某一个表对象
    
    print('-----------------------第一个-----------------------------')
    one_row = biao.row('0001')  # 获取一行数据,0001是行键
    for value in one_row.keys():  # 遍历字典
        print(value.decode('utf-8'), one_row[value].decode('utf-8'))  # 可能有中文,使用encode内置函数转码
    
    print('-----------------------第二个-----------------------------')
    print(biao.cells('0001', 'wangzherongyao:段位')[0].decode('utf-8'))  # 获取一个单元格信息,返回列表,转码输出,0001是行键,wangzherongyao是列簇名,是列名
    
    print('-----------------------第三个-----------------------------')
    for key, value in biao.rows(['0001', '0002']):  # 获取多行的数据,列表或元组中可以写入多个行键
        # print(key, '<=====>', value)  # 由于0002我没有写入数据,就查不到,也不返回信息
        for index in value.keys():  # 遍历字典
            print(key.decode('utf-8'), index.decode('utf-8'), value[index].decode('utf-8'))  # 可能有中文,使用encode转码
    
    print('-----------------------第四个----------------------------')
    for rowkey, liecu in biao.scan():  # 获取扫描器对象,该对象是可迭代对象。扫描器记录了一个表的结构
        # print(rowkey, '<=====>', liecu)
        for index in liecu.keys():  # 遍历字典
            print(rowkey.decode('utf-8'), index.decode('utf-8'), liecu[index].decode('utf-8'))  # 可能有中文,使用encode转码
    
    con.close()  # 关闭传输

    以上四种方法都支持添加时间戳选项查看数据

    3.3 删除数据

    import happybase
    
    con = happybase.Connection('192.168.31.105')  # 默认9090端口
    con.open()  # 打开传输
    
    biao = con.table('games')  # games是表名,table('games')获取某一个表对象
    
    biao.delete('0003', ['wangzherongyao:段位'])  # 删除一个单元格信息
    # biao.delete('0003', ['wangzherongyao:名字', 'wangzherongyao:等级'])  # 删除多个单元个信息
    # biao.delete('0003', ['wangzherongyao'])  # 删除一列簇信息
    # biao.delete('0003')  # 删除一整行信息
    
    # 查看数据,看看是否还在
    for rowkey, liecu in biao.scan():  # 获取扫描器对象,该对象是可迭代对象。扫描器记录了一个表的结构
        # print(rowkey, '<=====>', liecu)
        for index in liecu.keys():  # 遍历字典
            print(rowkey.decode('utf-8'), index.decode('utf-8'), liecu[index].decode('utf-8'))  # 可能有中文,使用encode转码
    con.close()  # 关闭传输

    前面说过,删除是根据时间戳来删除最近的版本,再次查看时显示的下一个时间戳最近的版本,那么下面测试一下是不是这样。

    import happybase
    
    con = happybase.Connection('192.168.31.105')  # 默认9090端口
    con.open()  # 打开传输
    
    biao = con.table('games')  # games是表名,table('games')获取某一个表对象
    biao.put('0001', {'wangzherongyao:段位': '最强王者'})
    biao.put('0001', {'wangzherongyao:段位': '永恒钻石V'})
    biao.put('0001', {'wangzherongyao:段位': '尊贵铂金I'})  # 重复写三个值
    print(biao.cells('0001', 'wangzherongyao:段位'))  # 查看单元格的数据显示为最后一个时间戳的版本,即尊贵铂金I
    
    biao.delete('0001', ['wangzherongyao:段位'])  # 删除单元格的信息,按照正常的理论查看时显示永恒钻石V
    print(biao.cells('0001', 'wangzherongyao:段位'))  # 查看单元格的信息,显示为空
    
    con.close()  # 关闭传输

    很奇怪,答案错误,他把里面的东西都删了,那么问题出现在哪里? 看 hbase shell 下是操作怎样的

     按照 hbase shell 的操作,理论上是没错的,那么问题出现在哪里?问题出现在 deleteall 操作

    可以猜测出,happybase库的 delete 函数封装的是 hbase shell 中的 deleteall 函数,所以调用要delete函数时要谨慎

    3.4 批处理

    batch()函数可以创建一个可执行对象,然后在进行批处理操作,其实该函数返回了Batch对象,Batch对象支持上下文管理协议,可以执行批量写put操作、批量删delete操作,然后还要使用发送send函数提交到服务器,个人感觉比较鸡肋。其实上面讲的delete函数就是调用了这里的delete函数

  • 相关阅读:
    多路RTSP流解码:最高可支持12路视频编解码
    RK3399 PRO快速开发
    人脸识别精准营销解决方案
    EC-A3399ProC 六核64位AI嵌入式主机
    Cluster Server R1集群服务器
    韦东山推出基于Firefly平台的升级版嵌入式Linux教程
    【上传图片】上传图片二三事
    【linux】阿里云防火墙相关
    【php】LAMP中开启错误提示
    【mysql】mysql优化
  • 原文地址:https://www.cnblogs.com/qiu-hua/p/14748508.html
Copyright © 2011-2022 走看看