• Hbase的scan原理


    **

    1、HBase 中的数据是按照 Rowkey 的 ASCII 字典顺序进行全局排序的。

    **
    可以参考一下例子

    # 例子"012", "0", "123", "234", "3",
    # 按 ASCII 字典排序后的结果为:"0", "012","123", "234", "3"。
    # 也就是说按照字符的ASCII值从左开始排序的
    
    • 1
    • 2
    • 3

    2、scan扫描原理

    假设我们的rowkey组成如下:prefix | time | row_id
    prefix:前缀
    time: 时间, 如20221011230000
    row_id:id, id默认填充值为4位,也就id.zfill(4)

    # 提供几组rowkey
    prefix|20221011140000|3233
    prefix|20221011150100|1312
    prefix|20221011160000|1223
    prefix|20221011150210|5212
    prefix|20221011151000|9234
    prefix|20221011152000|99991
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    假设有个场景:需要插入一个id长度为5位的row的,且这个id前四位都是999,现在想要扫描15:00-16:00这一个小时的数据
    一开始封装的方法,是根据填充值生成rowkey的起始值和结束值,分别为:
    rowstart: prefix|20221011150000|0000
    rowstop: prefix|20221011160000|9999
    最后,扫描结果如下:

    prefix|20221011150100|1312
    prefix|20221011160000|1223
    prefix|20221011150210|5212
    prefix|20221011151000|9234
    
    • 1
    • 2
    • 3
    • 4

    prefix|20221011152000|99991这条rowkey的数据没有被扫描到。

    这时,我们可以根据上面第一点的的特性

    HBase 中的数据是按照 Rowkey 的 ASCII 字典顺序进行全局排序的。

    将起始rowkey设置为:
    rowkey_start: prefix|20221011150000|
    ⚠️ 最后一个|后面是有一个空字符的 ‘’
    将结束rowkey设置为:
    rowkey_stop: prefix|20221011160000| ~
    这里用空字符‘’作为起始点,因为空字符对应的ASCII值为0,是最小的,比字符0-9都小
    用~ 作为结束,是因为~对应的ASCII值为126, 比字符9(ASCII值59)大

    最后扫描结果如下:

    prefix|20221011150100|1312
    prefix|20221011160000|1223
    prefix|20221011150210|5212
    prefix|20221011151000|9234
    prefix|20221011152000|99991
    
    • 1
    • 2
    • 3
    • 4
    • 5

    3、总结

    Hbase的scan主要是根据rowkey,从左到右进行扫描的,rowkey中的id主要用于filter,而不是用于scan中

  • 相关阅读:
    “程序员,致敬!”
    JavaScript --04. 流程控制语句介绍
    flutter Package 打包上传插件
    测试开发面试题
    Vue 3自定义指令:扩展你的应用功能
    PaperMoon开发者关系工程师(中国)招聘
    ansible-复制模块
    手撕——排序
    服务器硬件基础知识
    八 动手学深度学习v2 ——卷积神经网络之卷积+填充步幅+池化+LeNet
  • 原文地址:https://blog.csdn.net/weixin_41680234/article/details/127807054