【问题标题】:HBase row key and Range ScanHBase 行键和范围扫描
【发布时间】:2012-04-23 08:45:22
【问题描述】:

我有一个像 20110103 这样的行键模式--- 这样行键就会像 20110103-1-23-333。

例如,当我使用扫描进行范围查询时, startRow -> 20110103-1-23- endRow -> 20110105-1-23-

我也得到了不在上述范围内的行。例如,我也得到了 20110105-1-15-6666 行。我也得到了与 store 15 相关的行。

我该如何解决这个问题? RegularExpressionFilter 会解决这个问题吗....

请就这个问题提出建议....

【问题讨论】:

    标签: hbase


    【解决方案1】:

    在您列出的三个行键中:

    20110103-1-23-
    20110105-1-15-666
    20110105-1-23-
    

    对我来说,这看起来像是自然的排序顺序;以“666”结尾的确实是在以“20110103”开头的之后。

    (有一点令人困惑的是,对于 HBase,这些都只是字节,并且字典排序一次完成一个字节;因此,“aaa”将在“aa”之后但在“ab”之前排序。)

    【讨论】:

      【解决方案2】:

      您可以打开 hbase shell 发出以下命令

      scan 'YourHbaseTableName',{FILTER=>"(RowFilter(=,'regexstring:20110103'))"}
      

      【讨论】:

        【解决方案3】:

        行 20110105-1-15-6666 正确地在 [20110103-1-23-, 20110105-1-23-) 范围内,因为 15 小于 23 并且行的排序是字典顺序的。强>

        您提到“我正在获取与商店 15 相关的行”,这让我想象行键中的第三个数字 (________-_-23-) 是该行的某种属性。

        我建议更改此表的架构以使此“商店编号”成为一列,以便您的键看起来像 20110103-1 并且在“商店”列中您有这些数字 1523 或随便。

        这样,在 Scan 中,您可以过滤掉 column store=15 的行。

        如果您使用的是 Java API,这将类似于:

        SingleColumnValueFilter filter = new SingleColumnValueFilter(
           Bytes.toBytes("columnfamily"),
           Bytes.toBytes("storenumber"),
           CompareFilter.CompareOp.NOT_EQUAL,
           Bytes.toBytes(15)
        );
        filter.setFilterIfMissing(true);
        Scan scan = new Scan(
           Bytes.toBytes("20110103-1"),
           Bytes.toBytes("20110105-1")
        );
        scan.setFilter(filter);
        

        您可能在行键中存储了太多数据,请尝试在行键中获取其中一些属性并将它们设为列。另外请记住,您还可以使用日期(我想20110105 是一个日期)作为时间戳(表格的单元格)而不是行键。这取决于您的应用程序。

        【讨论】:

          【解决方案4】:

          假设 HBase 是一个多重嵌套的有序字节映射。 因此,您需要将时间戳保存在二进制表示中,以便在每个查询中获得正确的顺序。

          我认为您可以将行键值保存在字符串数据类型中,例如使用 java 方法:

          yourDateString.getBytes(encoding) 
          

          Bytes.toBytes(yourDateString)
          

          由 HBase API 添加。

          我的建议是将时间值保存为时间戳(长)。 这个 long 应该被序列化为字节,然后保存在 rowkey 中。 请注意,由于不断上升的性质,在行键中保存时间戳有点问题。时间戳每毫秒都会变大,因此每个新值都将保存到管理该区域的 HBase 区域。简单地说,您只需写入其中一台集群机器,这不是使用 HBase 集群的目标。 对于大小为 100 个机器的集群,您可以使用 salting(在 rowkey 前面放置一个随机数以将所有值分布在整个集群中)。 查看phoenix 项目。 它透明地为您完成序列化、加盐等操作,提供简单的类似 SQL 的语句。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2014-02-04
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2017-03-22
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多