【问题标题】:HBase: How to fetch rows using row key range if row key is stored as byte array valueHBase:如果行键存储为字节数组值,如何使用行键范围获取行
【发布时间】:2014-01-23 10:48:13
【问题描述】:

我们使用 HBase 存储从 oracle 到 hdfs 的数据。这里我们将行键设计为字节数组值。行键用(Md5(schema name).getBytes() + Md5(date (format = yyyy-mm-dd)).getBytes() + ByteBuffer.allocate(8).putLong(pkid).array()) 之类的复合键框起来。这里 PKID 是一个长值。

如果我想获取特定模式和特定日期的所有行,我可以使用 startrow 和 endrow 或任何其他方式查询 hbase 表吗?

当我将行键存储为user1_20130123...user1_20130127 等字符串时 我可以使用

过滤表格
scan 'TempTable', {
    COLUMNS => ['CF:NAME'],
    LIMIT => 10,
    STARTROW => 'user1_20100101',
    ENDROW => 'user1_20100115'
}

在这里,我正在获取这些日期中 user1 的行。当我像上面一样存储行键时,我该如何查询?

【问题讨论】:

    标签: hbase database-scan


    【解决方案1】:

    您的行键有问题,如果您散列日期,您将无法将其用作扫描的开始/停止行。

    你的行键应该是这样的:

    [16B_schema_MD5_hash][8B_long_timestamp][8B_pkid]
    

    你可以这样查询:

    Scan myScan = new Scan( 
        Bytes.add(Bytes.toBytes(schemaNameMD5Hash), Bytes.toBytes(startTimestamp)),
        Bytes.add(Bytes.toBytes(schemaNameMD5Hash), Bytes.toBytes(stopTimestamp))
    );
    

    【讨论】:

    • 好的,我知道了,所以如果我将行键存储为[16B_schema_MD5_hash][yyyymmdd][8B_pkid],那么我将能够查询,我用行键作为“user1_20130101”进行了测试.如果我错了,请纠正我。
    • 当然,您可以这样做,因为该特定格式的日期排序正常。请记住,您将获得相同的 32 字节密钥(yyyymmdd 是一个 8 字节字符串),但精度要低得多(天而不是毫秒)。
    • 当我们使用哈希值和字符串、long(字符串的转换字节数组,long 的转换字节数组)值组合存储行键时,会不会有任何性能问题。意思是,从 HBase 表中查询记录将是这种行键设计的性能问题?
    • 不,它不会,HBase 行键只是字节数组,你使用什么样的数据来生成它们并不重要。尽量让它们尽可能小(即:如果“模式”的类型不多,不要使用完整的 16B MD5 哈希,只使用 8B 的前半部分)
    • 请注意,我们配置的分割不是十六进制的,它们是字符,这样,任何以“b”(\x62 HEX)开头的行都将转到“b”区域,或者“1”(\x31 HEX)以下的任何行都将被发送到“0”区域,这就是为什么所有内容都将发送到第一个区域。我建议您更新脚本,使第一个字节是代表十六进制值 [0-9a-f] 的 ASCII 字符(或更新您的拆分以使用您的一个字节十六进制。看看这个:gist.github.com/rmruano/9204707
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-25
    • 1970-01-01
    • 1970-01-01
    • 2014-01-29
    相关资源
    最近更新 更多