若想深入理解Hbase的系统架构,推荐:https://www.jianshu.com/p/479bc6308381

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

使用happybase库操作hbase

先安装该库 pip install happybase

然后确保 hadoophbase 可用并开启

  • 能进行hdfs操作就代表hadoop正常运行
  • 能在 hbase shell 下使用 list 命令并不报错就代表能正常运行

开启thrift

使用命令开启

./usr/local/hbase/bin/hbase-daemon.sh start thrift

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

QuorumPeerMain:zookeeper开启后的节点(我自己搭建的zookeeper,不是使用hbase自带的)

Hmaster:hbase的主节点

ThriftServer:hbase使用上面的命令开启后产生的节点

Main:使用hbase shell之后就产生了,关闭hbase shell就退出了,他可有可无,不影响本次操作

NameNode:hdfs的主节点

HRegionServer:hbase开启后的节点,它用于负责数据的读写服务

Jps:java的一个进程

SecondaryNameNode:hdfs的辅助节点,保证了NameNode中元数据的安全和可靠

DataNode:hdfs存储数据的节点

Python连接hbase

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

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

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

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

hbase表的结构

想对表的数据进行操作,得先懂表的结构

  • 和关系型数据库(RDBMS)不同,hbase的表有列簇,可以理解为一个组,比如描述一个人要很多数据,比如身份信息(名字、性别、年龄、电话号码、家庭住址等),行为信息(访问了那些页面、在页面操作了什么等),可能还有很多种类的信息用来描述一个人(方便向他推荐什么产品)。如果把这些信息都像关系型数据库那样放在同一个表中作为列,那么以后取数据的时候会头大,几百几千列,列簇的好处就体现出来了,可以将这些信息归类到一个组中,如身份信息组,行为信息组等。列簇可以增加
  • 行键是唯一的,相当于关系型数据库的主键,用来标识一行。行可以增加
  • 一个列簇之下可以有N多个列。列可以增加,与RDBMS不同,RDBMS在某一列中没有值时,也会占用该空间,而hbase不会占用空列
  • 如:zhong、18、110等数据都有版本,或者说时间戳,它们都是同一个意思,一个数据写下之后,系统自动记录下当前写入的时间戳,和数据存放在一起。为了防止对数据的误操作,或为了程序不同版本功能的控制,有了版本的概念,首先对一个数据进行重复赋值时,新的值并没有覆盖掉之前的值,而是以时间戳来存放不同的值,一个时间戳就代表一个版本。删除一个数据时,并不是直接将该数据从磁盘清除,而是像操作系统的删除操作般,将该信息标记为不可读,并且在hbase中删除只是删除最近的一个时间戳信息,旧版本的时间戳信息没有被删除,下一次读取数据时,就会读取到剩下的最近的一个时间戳信息。默认有三个时间戳
  • 一个信息如“男”或者“110”等,又称为单元格(cell),标识一个数据要使用到的信息:表名、行键、列簇:列名、时间戳
  • hbase没有数据类型之分,如:没有整形,浮点型,布尔值等,只有一个字符类型
  • hbase建立数据后,会根据行键进行排序,这样使查询变快。就像查字典似的,如果一页一页的查找就很慢,如果按拼音,就可以确定一个区域,然后就可以在这个区域内查找,当然,实际可能比这个过程更复杂

可以想象自己是阿里的数据分析师,现在要分析一个人,首先需要标识一个人,给他个编号,0001就代表他了;我想从身份、性格、行为、心理这四方面分析他,我就建立四个列簇,分别代表四个方面;昨天我分析他行为时,只记录了他点开了某个页面,可今天我突然想到,他可能是误点了,或随意点了一下,不能代表他喜欢那个商品,然后我在行为列簇中增加了一列,该列记录了他在该页面停留的时间;我为淘宝的用户设置了10个等级,然后设置记录等级的列簇的选项中设置最大10个版本,昨天他还是1级,由于他经常逛淘宝,他今天的等级提升到2级,我就知道了他有点喜欢逛淘宝,我就给他发一个10元通用的优惠卷,可我用2级的时间戳减去1级的时间戳后发现,他只用了3个小时,我就知道了他逛了好久,通过行为分析,我发现他经常在两个商家中逛同一件商品,似乎在比较两家商品哪个性价比更高,由于A商店跟我们公司的合作比较深入,我就给他发了一个优惠A商店20元的优惠卷。

当要分析另一个人时,重复以上操作,从这里可以看出,hbase是注重列的

创建表

import happybasecon = 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类型)

启动或禁用表

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

# 禁用表
import happybasecon = 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 happybasecon = 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()  # 关闭传输

删除表

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

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

建立数据

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

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

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

import happybasecon = 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()  # 关闭传输

查看操作

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

import happybasecon = 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()  # 关闭传输

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

删除数据

import happybasecon = 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 happybasecon = 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:段位'))  # 查看单元格的数据显示为最后一个时间戳的版本,即尊贵铂金Ibiao.delete('0001', ['wangzherongyao:段位'])  # 删除单元格的信息,按照正常的理论查看时显示永恒钻石V
print(biao.cells('0001', 'wangzherongyao:段位'))  # 查看单元格的信息,显示为空con.close()  # 关闭传输

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

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

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

批处理

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

python使用happybase库操作hbase相关推荐

  1. python使用hdfs库操作Hadoop的HDFS

    此次使用python的hdfs库操作HDFS,首相安装该库:pip install hdfs 其次,要保证HDFS可用,如下图就代表可用,当然你列出的文件和我的不同 老规矩,先来看看它这个库的大概结构 ...

  2. python利用 WMI 库操作windows

    转载自 http://python.jobbole.com/86349/ 最近在网上搜索Python和WMI相关资料时,发现大部分文章都千篇一律,并且基本上只说了很基础的使用,并未深入说明如何使用WM ...

  3. python使用xlwings库操作Excel常见操作

    目录 安装 **前置知识** 详细使用步骤 **一.打开Excel程序** **二.保存.退出.关闭** **三.新建 Excel 文件** **四.读取内容** **五.写入数据** 1.写入当前文 ...

  4. python使用 docx 库操作 docx 格式文件

    docx 库 文章结构: 一.docx 基本用,创建 docx 文件并添加数据 二.深入理解文本格式(format),并设置所格式属性(attribute) 三.深入理解样式(styles),以及如何 ...

  5. Python使用openpyxl库操作Excel之(一)创建并保存一个Excel文件

    ①安装openpyxl库 打开cmd,输入 pip install openpyxl 命令即可. ②创建并保存一个Excel文件 import openpyxl #生成一个 Workbook 的实例化 ...

  6. python通过PyYaml库操作yaml文件

    1.YAML文件介绍 YAML全称YAML Aint't a Markup Language(YAML不是一种标记语言),是一种易读的序列化语言 通常应用在一些数据代码分离的场合,比如配置文件中 2. ...

  7. Python使用openpyxl库操作Excel之(二)访问已有的Excel文件

    ①指定路径打开Excel文件 使用openpyxl.load_workbook()方法来访问文件,括号内参数为文件的指定路径. 运行结果: <class 'openpyxl.workbook.w ...

  8. Python 使用docx库操作word文档中的表格单元格内容

    1.导入库 from docx import Document 2.加载word文档对象 doc = Document(path) 3.定位表格 # 获取所有表格对象 tables = doc.tab ...

  9. PHP通过Thrift操作Hbase

    HBase是一个开源的NoSQL产品,它是实现了Google BigTable论文的一个开源产品,和Hadoop和HDFS一起,可用来存储和处理海量column family的数据.官方网址是:htt ...

最新文章

  1. linux下实用小脚本,十个增加 Linux Shell 脚本趣味的小工具
  2. 2017,SAP向云看齐
  3. VTK修炼之道47:图形基本操作进阶_法向量计算
  4. 程序员如何用Python了解女朋友的情绪变化?
  5. Linux复习资料——CentOS7下安装MySQL5.7.22(完整版本)
  6. Redis工作笔记-Hash类型
  7. LeetCode:每日一题(2020.4.13)
  8. Spring bean注入之constructor-arg注入和property注入的区别
  9. 3D打印机之Marlin固件配置
  10. 圆角正方形 html,ps正方形角怎么变圆角 ps怎么在原来的矩形中改成圆角
  11. 解密拼多多800元裂变营销新方法
  12. 寒江独钓前辈的第一个例子的部分分析
  13. 2020年6月TIOBE编程语言排名公布
  14. xposed android debug,Android 手机开启全局调试xposed插件
  15. ppt演讲计时器_速来!提前面试PPT演讲干货!
  16. RTK计算参数为什么比例必须是0.999或1.000?
  17. 新三级医院信息化建设解决方案
  18. PTA - [第四届团体程序设计天梯赛]PTA使我精神焕发
  19. 【续】DeepMind项目取得新进展:一种改进机器人学习系统的新思路
  20. 爱玩吧提供10G国外免费PHP空间

热门文章

  1. hdu 4990 Reading comprehension
  2. 解释--全连接层输入大小固定
  3. 标准c语言程序设计答案,C语言程序设计标准答案.doc
  4. Window操作系统补丁知多少
  5. 【Unity】俯视角相机地面视野范围的计算
  6. 八字得令得地得势--论六亲第5节
  7. 机器人总动员片尾曲歌词_电影歌曲:《机器人总动员》环保主题歌 Down to(
  8. 齐博x1教程:通用栏目名称及参数调用接口
  9. JS_无法监听audio的ended事件,监听audio播放结束无效
  10. js中的迭代器与生成器(详解)