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

这篇具有很好参考价值的文章主要介绍了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 OrderedDict
rows_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 参数确定时间戳是否包含在结果中。例子:文章来源地址https://www.toymoban.com/news/detail-553766.html

# 首先,准备一个保存多版本的表
create 'tv', {NAME => 'info', VERSIONS => 5}
# 插入版本1
put 'tv', 'rk0001', 'info:name', 'hahaha'
# 插入版本2
put '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)]
"""

到了这里,关于HBase数据表查询操作和获取多版本数据的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • SQL Server多数据表之间的数据查询和分组查询

    在SQL中,多数据表之间的查询主要用于以下方面: 在SQL Server中,多数据表之间的数据查询主要用于以下几个方面: 关联数据提取 :现代数据库通常将数据分散在多个相关的表中以便于管理。例如,订单信息可能存储在一个表中,而客户信息可能存储在另一个表中。为了获取

    2024年01月24日
    浏览(49)
  • MySQL数据库——MySQL SELECT:数据表查询语句

    在 MySQL 中,可以使用 SELECT 语句来查询数据。查询数据是指从数据库中根据需求,使用不同的查询方式来获取不同的数据,是使用频率最高、最重要的操作。 SELECT 的语法格式如下: 其中,各条子句的含义如下: {*|字段列名} 包含星号通配符的字段列表,表示所要查询字段的

    2024年02月05日
    浏览(43)
  • SQL Server 数据表模糊查询(like 用法)以及查询函数

    在SQL Server Management Studio (SSMS) 中,进行模糊查询主要是通过使用 like 操作符来实现的。 like 操作符用于在 where 语句中搜索列中具有指定模式的数据。 我们在简单例子中来了解: % 通配符:表示任意数量的字符。 这个例子会选择 column_name 列中包含\\\"pattern\\\"这个词的所有记录,就

    2024年01月22日
    浏览(60)
  • Mysql 查询数据库或数据表中的数据量以及数据大小

     许多数据库的元数据都是存储在mysql中的,例如hive、startrockes,因此可以通过mysql中的“information_schema.TABLES”表来查询对应数据库或对应数据表的具体信息。 1、查询各个数据库中的数据条数和数据大小 2、查询各个数据表中的数据条数和数据大小 3、查看指定数据库容量大小

    2024年04月27日
    浏览(33)
  • 8-MySQL查询高级用法,数据表的关联关系

    1.分组 group by 详情见,发布的第七篇博客文章,7- MySQL函数 2.排序 order by 说明: 在MySQL中,ORDER BY是一种用于对查询结果进行排序的。它可以根据一列或多列的值,以升序或降序的方式对查询结果进行排序,使得查询者可以更加方便 地查看、分析和处理数据。 使用OR

    2024年02月08日
    浏览(42)
  • 查询Oracle当前用户下,所有数据表的总条数

    查询Oracle当前用户下,所有数据表的总条数 方法1:存储过程 (文末有方法2,一个SQL也可轻松搞定!) 右键点击 Procedures ,点击 New 点击 OK 把存储过程写进去,然后点击编译运行: 3.2.1 方法一 方法2 点击File -- New -- Test Window 写入刚刚新增的存储过程 方法2:SQL select sum(t.NUM_RO

    2024年02月12日
    浏览(44)
  • Hive数据表删除数据操作

    hive数据表中,数据的删除不可以想Oracle、MySQL那样使用delete语句删除,所以在删除数据的时候使用另外的方法 hive的数据删除,一般是两种方式 当需要删除某一条数据的时候,我们需要使用 insert overwrite 释义:就是用满足条件的数据去覆盖原表的数据,这样只要在where条件里

    2024年02月11日
    浏览(36)
  • MySQL数据表操作

    目录 内容如下 一、相关的概念 one / 表(关系表) two / 字段(表结构) three / 记录(具体的数据) four / 表之间的关系 five / 二、数据类型 one / 整数类型 two / 浮点数类型 three / 定点数类型 four / 字符类型 five / 日期时间类型 six / 二进制类型 三、存储引擎 one / 概念 tw

    2024年02月10日
    浏览(37)
  • MySQL数据表高级操作

    方法一: 方法二: 方法一 DELETE清空表后,返回的结果内有删除的记录条目; DELETE 工作时是一行一行的删除记录数据的;如果表中有自增长字段,使用DELETE FROM 删除所有记录后,再次新添加的记录会从原来最大的记录ID后面继续自增写入记录。 方法二 TRUNCATE清空表后,没有返回

    2024年02月16日
    浏览(32)
  • MySQL大数据表处理的三种方案,查询效率嘎嘎高

    场景 当我们业务数据库表中的数据越来越多,如果你也和我遇到了以下类似场景,那让我们一起来解决这个问题 数据的插入,查询时长较长 后续业务需求的扩展 在表中新增字段 影响较大 表中的数据并不是所有的都为有效数据 需求只查询时间区间内的 评估表数据体量 我们可

    2024年02月13日
    浏览(35)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包