首页 > 快讯 >

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

2023-05-26 18:27:29 来源:今日头条

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",注意是二进制类型# 转换字符串: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)"""返回值:{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)"""返回值:{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)"""返回值:[b"heiheihei"]"""# 获取2个版本values = table.cells(b"rk0001", b"info:name", versions=2)print(type(values))print(values)"""返回值:[b"heiheihei", b"hahaha"]可见,2个版本都获取了,按照顺序,第一个最新"""# 获取多版本并附带时间戳信息values = table.cells(b"rk0001", b"info:name", versions=2, include_timestamp=True)print(type(values))print(values)"""返回值:[(b"heiheihei", 1641836267655), (b"hahaha", 1641836263534)]"""
上一篇:

甘肃省卫生职业学院兰州新区技术分数线

下一篇:

最后一页

x
推荐阅读

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

甘肃省卫生职业学院兰州新区技术分数线

五月第四周,告诫,双子座

日本首相岸田文雄正安排参加北约峰会 中国外交部回应

起底电诈⑦丨我该怎么办?“银监会”通知我“征信存在不良记录”将影响孩子上学!

天天快播:无功补偿装置_关于无功补偿装置介绍

天天速讯:济安金信“群星汇”基金奖揭晓 富国基金揽获三项重磅大奖

“乌克兰危机是美国攫取暴利的工具”

两部门:拟将15个项目确定为2023年中央财政支持中医药传承创新发展示范试点项目 世界焦点

每日速读!11人制足球场尺寸图标准(11人制足球场尺寸)

中东部降雨过程进入最强时段 周末南方将提前感受盛夏般闷热 天天新消息

天天消息!打比方的句子短一点怎么写_打比方的句子短一点

四月份,虾类进口量环比下滑,厄虾到货量减少30% 天天观点

天天微动态丨中远海控:5月25日融资买入3052.61万元,融资融券余额47.16亿元

2022 年 Alpine A110 的更新在欧洲公布

中西部省会城市,为何成为人口赢家?

李宁鞋上的标志_李宁鞋子的标志是怎样的简介介绍

隆基绿能李振国:过半光伏企业会被洗牌出局_世界快报

车牌可以过户吗(车牌过户需要什么手续)

RTX 4060 Ti在日本遭空前冷遇:线下首发只卖出一块 天天快报

环球快报:松下将一如既往发展在华业务

丰立智能:公司生产的精密减速器产品目前尚未应用于人型机器人领域

巴黎奥运会男足资格赛首阶段小组赛连避强队,中国国奥队签运极佳_全球实时

全球快资讯丨进入换季期,服装消费增长,纺织服装企业满负荷运转?

蛋挞液的制作方法无淡奶油

真正成熟的男人,就会戒掉这三样东西|当前独家

环球观焦点:未成年人网络司法保护白皮书发布

快讯:涨停雷达:汽车零部件个股异动 亚普股份触及涨停

新股消息 | 众淼创科递表港交所 致力于推动中国保险中介行业的数字化发展|环球时讯

玻璃深加工企业发展状况 2023年中国玻璃加工行业发展分析与投资前景预测_焦点热闻

5月25日全国碳市场碳排放配额收盘价与前一日持平 百事通

5月25日 10:03分 锋龙股份(002931)股价快速拉升

多地发生学生溺亡事件,教育部发布预警

A股服装家纺板块拉升

争先创优!奋力推进临湘检察工作高质量发展_世界报道

百度何俊杰:用AI原生思维“刷新”百度APP、搜索、文库、电商等产品|全球今日讯

世界热议:2023湖南高考准考证打印时间及入口 在哪打印

共青团开展2023届高校毕业生就业岗位帮扶 全球新动态

深圳:鼓励银行为“20+8”产业集群等开辟信贷绿色通道 全球速讯

每日速看!二期代理

每日信息:晋控电力下好迎峰度夏“先手棋”

播报:湖北自主创新消化道早癌智能筛查技术

全球消息!太原检察能动履职护佑汾酒品牌

环球观热点:东风股份:5月24日融资买入420.85万元,融资融券余额2.79亿元

环球简讯:如何将视频放到ppt 如何将视频放到文件夹里

《怦然心动20岁》第三季正式开播,沈月易梦玲张柏芝恋综首秀|热议

仿真树枝是用什么做的原料 仿真树是用什么材质来做的

自然资源部公开曝光 部分地方仍“毁田造景”

最后是你就好_对于最后是你就好简单介绍 前沿资讯

热推荐:育碧游戏怎么免费领取_育碧免费游戏怎么领