【问题标题】:Java: Hadoop: MapReduce: using filters for retrieving data from hbase, int/string comparisonJava:Hadoop:MapReduce:使用过滤器从 hbase 检索数据,int/string 比较
【发布时间】:2012-03-19 16:47:17
【问题描述】:

我想为我的 mapreduce 作业从 hbase 检索数据,但我想先过滤它。我只想检索数据,其中包含一个 id 大于或等于 minId 的列。

我将 Id 作为字符串存储在 HBase 中。现在我想知道使用这个过滤器是否有效。

int minId = 123; Filter filter = new ValueFilter(CompareFilter.CompareOp.GREATER_OR_EQUAL, new BinaryComparator(Bytes.toBytes(minId)));

当存储的ID是String,但用于比较数据的值是int时,HBase如何过滤我的数据?这能行吗?如果我为我的 BinaryComparator 使用一个字符串(那么String mindId = "123"; 会这样吗?

感谢您的回答!

【问题讨论】:

    标签: java filter hadoop mapreduce hbase


    【解决方案1】:

    HBase 字符串过滤器使用词法比较。所以,这只有在否时才有效。所有 id 中的位数相同。您可以做的一件事是对 ID 进行零填充。

    所以“123”>“121”,但“123”

    另一个想法是创建一个比较器来满足您的要求。只需覆盖 BinaryComparators compareTo() 方法。可能是这样的(我只是在编辑PureJavaComparator中的 compareTo 方法):

      @Override
      public int compareTo(byte[] buffer1, int offset1, int length1,
          byte[] buffer2, int offset2, int length2) {
        // Remove leading zeros
        int l1 = getNumLeadingZeros(buffer1, offset1, length1);
        int l2 = getNumLeadingZeros(buffer2, offset2, length2);
        offset1=offset1+l1;
        length1=length1-l1;
        offset2=offset2+l2;
        length2=length2-l2;
    
        // If lengths are different, just return the longer int
        int ldiff = length1-length2;
        if(ldiff != 0) return ldiff;
    
        // If lengths are same, we can use the usual lexical comparator
        return Bytes.compareTo(buffer1, offset1, length1, buffer2, offset2, length2);
      }
    
      public int getNumLeadingZeros(byte[] arr, int offset, int length) {
          int ret = 0;
          byte zero = '0';
          int i=0;
          while(i<length && arr[offset+i]==zero) {
              ++ret;
          }
          return ret;
      }
    

    它不是超级优化的,它假设没有坏值。如果你确定不会有这样的事情,你也可以滑掉前导零的东西。我还没有测试过,所以请尝试一下,如果它有效,请告诉我!

    【讨论】:

    • 有没有其他方法可以与 Hadoop 中的字符串进行比较?因为如果我已经将它们存储在 Hadoop 中,那么该过滤器应该如何工作?我必须在 HBase 中操作已经存储的 id,对吗?当我不使用 String 时,比较会起作用吗?
    • 您可以尝试覆盖默认比较器并创建自己的比较器来处理此问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-17
    • 2015-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-18
    相关资源
    最近更新 更多