HBase数据表如何查询操作和获取多版本数据?

HBase数据模型是一个多维稀疏映射。 HBase中的表包含列族,其列限定符包含值和时间戳。在大多数 HappyBase API 中,列族和限定符名称被指定为单个字符串,例如cf1:col1,而不是作为两个单独的参数。虽然列族和限定符在 HBase 数据模型中是不同的概念,但它们在与数据交互时几乎总是一起使用,因此将它们视为单个字符串会使 API 变得更简单。

查询行

Table 类提供了多种方法来从 HBase 中的表中检索数据。最基本的是 Table.row(),它从表中检索单行,并将其作为映射列到值的字典返回:

row = table.row(b'rk0001')print(row[b'info:name'])   # prints the value of info:name# 返回值:b'zhangsan',注意是二进制<class 'bytes'>类型# 转换字符串:print(str(row[b'info:name'], encoding="utf-8"))# 即str(bytes对象, encoding="编码格式,通常使用utf-8")

> 注意,库中的字符串都有前缀:b,表示二进制

> 如:print(type(row[b'info:name']))

> 返回值:

查询多行

Table.rows() 方法的工作方式与 Table.row() 类似,但需要多个行键并将它们作为 (key, data) 元组返回:

rows = table.rows([b'rk0001', b'rk0002'])for key, data in rows:    print(key, data)"""返回值:b'rk0001' {b'data:pic': b'picture', b'info:age': b'20', b'info:gender': b'female', b'info:name': b'zhangsan'}b'rk0002' {b'data:pic': b'picture', b'info:age': b'11', b'info:gender': b'male', b'info:name': b'wangwu'}注意哦,key是bytes对象data是字典对象,字典中key和value都是bytes

如果您希望 Table.rows() 作为字典或有序字典返回的结果,您必须自己执行此操作。不过这真的很简单,因为返回值可以直接传递给字典构造函数。对于普通字典,顺序丢失:

rows_dict = dict(table.rows([b'rk0001', b'rk0002']))# 返回值:"""字典:{b'rk0001': {b'data:pic': b'picture', b'info:age': b'20', b'info:gender': b'female', b'info:name': b'zhangsan'},  b'rk0002': {b'data:pic': b'picture', b'info:age': b'11',  b'info:gender': b'male', b'info:name': b'wangwu'}}"""

而对于 OrderedDict,顺序被保留:

from collections import OrderedDictrows_as_ordered_dict = OrderedDict(table.rows([b'rk0002', b'rk0001']))"""返回值:OrderedDict([(b'rk0002', {b'data:pic': b'picture', b'info:age': b'11', b'info:gender': b'male', b'info:name': b'wangwu'}), (b'rk0001', {b'data:pic': b'picture', b'info:age': b'20', b'info:gender': b'female', b'info:name': b'zhangsan'})])"""

进行更细粒度的查询

HBase 的数据模型允许对要检索的数据进行更细粒度的选择。如果您事先知道需要哪些列,则可以通过将这些列明确指定给 Table.row() 和 Table.rows() 来提高性能。 columns 参数采用列名的列表(或元组):

row = table.row(b'rk0001', columns=[b'info:name', b'data:pic'])# row对象类型字典,内容:{b'data:pic': b'picture', b'info:name': b'zhangsan'}print(row[b'info:name'])print(row[b'data:pic'])"""返回值:bytes类型,需要的话自行转字符串b'zhangsan'b'picture'

如果检索一整个列族中的所有列(二级列)。例如,要获取列族 info中的所有列和值,请使用以下命令:

row = table.row(b'rk0001', columns=[b'info'])print(type(row))print(row)"""返回值:<class 'dict'>{b'info:age': b'20', b'info:gender': b'female', b'info:name': b'zhangsan'}"""

基于时间戳查询

在 HBase 中,每个单元都有一个附加的时间戳。如果您不想使用存储在 HBase 中的最新版本数据,则可以使用从数据库中检索数据的方法,例如Table.row() 都接受一个时间戳参数,该参数指定结果应限制为时间戳不超过指定时间戳的值:

row = table.row(b'rk0001', timestamp=123456789)

默认情况下,HappyBase 在返回的结果中不包含时间戳。在您的应用程序需要访问时间戳时,只需将 include_timestamp 参数设置为 True。现在,结果中的每个单元格都将作为(值,时间戳)元组返回,而不仅仅是一个值:

row = table.row(b'rk0001', columns=[b'info'], include_timestamp=True)print(type(row))print(row)"""返回值:<class 'dict'>{b'info:age': (b'20', 1641832837038), b'info:gender': (b'female', 1641832832414), b'info:name': (b'zhangsan',  1641832826093)}"""

获取多版本数据

HBase 支持存储同一单元的多个版本。这可以为每个列族配置。要检索给定行的列的所有版本,可以使用 Table.cells()。此方法返回一个有序的单元格列表,最新版本排在最前面。版本参数指定要返回的最大版本数。就像检索行的方法一样,include_timestamp 参数确定时间戳是否包含在结果中。例子:

# 首先,准备一个保存多版本的表create 'tv', {NAME => 'info', VERSIONS => 5}# 插入版本1put 'tv', 'rk0001', 'info:name', 'hahaha'# 插入版本2put 'tv', 'rk0001', 'info:name', 'heiheihei'# 检查hbase(main):024:0> scan 'tv'ROW                          COLUMN+CELL                                                                        rk0001                      column=info:name, timestamp=1641836267655, value=heiheihei                        1 row(s)Took 0.0103 seconds
table = connection.table('tv')# 获取1个版本(默认最新咯)values = table.cells(b'rk0001', b'info:name', versions=1)print(type(values))print(values)"""返回值:<class 'list'>[b'heiheihei']"""# 获取2个版本values = table.cells(b'rk0001', b'info:name', versions=2)print(type(values))print(values)"""返回值:<class 'list'>[b'heiheihei', b'hahaha']可见,2个版本都获取了,按照顺序,第一个最新"""# 获取多版本并附带时间戳信息values = table.cells(b'rk0001', b'info:name', versions=2, include_timestamp=True)print(type(values))print(values)"""返回值:<class 'list'>[(b'heiheihei', 1641836267655), (b'hahaha', 1641836263534)]"""

本文来自投稿,不代表重蔚自留地立场,如若转载,请注明出处https://www.cwhello.com/265499.html

如有侵犯您的合法权益请发邮件951076433@qq.com联系删除

(0)
黑马程序员黑马程序员订阅用户
上一篇 2023年5月28日 17:55
下一篇 2023年5月29日 07:26

相关推荐

  • 我来教你大数据时代下SEO优化的新要求是什么。

    大数据时代的到来与信息技术的发展是分不开的。通过系统自动分析客户的喜好,从而精准的推送相关网站推广链接,真正做到按需定制的服务。大数据、云计处成为主流,对于网站优化来提供更为灵活的抓取模式,真正是投…

    2023年6月23日
    010
  • 小编教你每天检查seo数据性能重要吗。

    通过这种方式,您可以了解您所做的seo,并了解需要优化的内容以及需要纠正的内容。 SEO监控的重要性当然是测试SEO的有效性。它不仅报告了SEO对公司高层管理人员和其他部门的网站流量和利润的贡献,也使SEO团队了解…

    2023年6月9日
    05
  • 我来分享SEO优化人员怎样进行数据分析。

    做seo优化,我们必须要懂得数据分析,不懂数据分析的SEO不是好SEO,那么今天我们就来聊聊数据分析的那些事。 1、分析网站数据 影响关键词排名的重要因素: 跳出率:这个是严重影响转化成交的重要因素。它是和页面质…

    2023年6月28日
    01
  • 小编分享直通车数据差怎么办。

    首先要了解质量分的组成:创意质量、相关性、买家体验。创意质量:影响因素包括创意的点击率,点击反馈即点击转化率。一些淘宝卖家开通了直通车之后也会天天去分析店铺的数据,但是却发现数据很差,出现这种情况应…

    2023年11月4日
    03
  • 教你网站SEO优化中最重要的一些要素。

    SEO中真正重要的是什么?什么东西让你的网站SEO排名更高?什么让你的百度排名更好?排名的秘诀是什么?小编与您谈谈网站SEO优化中最重要的一些要素。1.SEO优化关键词关键词很重要,因为它们会使网站在搜索引擎中具…

    2023年3月10日
    03
  • 我来分享通过数据分析进行关键词排名。

        相信很多人都听到过这样一句俗语,希望越大,失望就越大。这句话放到关键词排名上依然适用。今天小编就从数据分析的角度为大家讲述一些关于关键词排名的方法。    一、百度给我们的关键词排名的参考    百度数…

    2023年6月30日
    01
  • 网站数据分析有哪些步骤以及作用

    我们在网络营销的时候经常会遇到各种问题,想要网站的营销效果更好一定要对网站的数据进行分析,网站数据分析有哪些步骤?网站数据分析有什么作用呢?下面就让我们一起去看看吧。 网站数据分析 网站数据分析有哪些步…

    2022年5月21日
    0329
  • 我来分享网络推广时一定要注意这些问题。

    网络推广时一定要注意这些问题! 网络推广就是把企业产品或服务的核心内容,建立成网站平台或者推广界面等形式,再把这些需推广的网站建设的界面通过各种的渠道展示给网民的一种推广方式。网络推广有成本低、效率高…

    2022年11月14日
    02

联系我们

QQ:951076433

在线咨询:点击这里给我发消息邮件:951076433@qq.com工作时间:周一至周五,9:30-18:30,节假日休息