HBase:HBase如何知道行是否包含特定列

HBase:HBase如何知道行是否包含特定列,hbase,Hbase,HBase如何知道行是否包含特定列?例如,考虑以下情况: 假设我们有一个表,它有一个名为“STAT_FAM”的列族,有以下两行: 一行,键为“R1”,包含1000列,命名为S1到S1000 以及另一行,其键为“R2”,其中包含另外1000列,命名范围为S2000到S3000 现在,如果我们正在扫描表,扫描定义如下: Scan s = new Scan(); s.setStartRow ( Bytes.toBytes(“R1”) ); s.setStopRow ( Bytes.toBytes(

HBase如何知道行是否包含特定列?例如,考虑以下情况:

假设我们有一个表,它有一个名为“STAT_FAM”的列族,有以下两行:

  • 一行,键为“R1”,包含1000列,命名为S1到S1000
  • 以及另一行,其键为“R2”,其中包含另外1000列,命名范围为S2000到S3000
现在,如果我们正在扫描表,扫描定义如下:

Scan s = new Scan();
s.setStartRow ( Bytes.toBytes(“R1”) );
s.setStopRow ( Bytes.toBytes(“R2”) );
s.addColumn( STAT_FAM, Bytes.toBytes(“S500”) );
s.addColumn( STAT_FAM, Bytes.toBytes(“S2500”) );
当HBase基于行键进行扫描时,它将在特定区域服务器上的特定文件中找到记录。找到记录后,它如何查找行数据中的特定列

对于行“R1”,没有名为“S2500”的列,因此它是否必须检查该行的完整记录以确定该行不包含所需的列


提前谢谢

首先让我们了解HBase如何存储数据。

Hfile的键值包括:

<keylength> <valuelength> <key> <value>
以及来自该方法的org.apache.hadoop.hbase.KeyValue类

  /**
   *
   * @param family column family
   * @param qualifier column qualifier
   * @return True if column matches
   */
  public boolean matchingColumn(final byte[] family, final byte[] qualifier) {
    int rl = getRowLength();
    int o = getFamilyOffset(rl);
    int fl = getFamilyLength(o);
    int ql = getQualifierLength(rl,fl);
    if (!Bytes.equals(family, 0, family.length, this.bytes, o, fl)) {
      return false;
    }
    if (qualifier == null || qualifier.length == 0) {
      if (ql == 0) {
        return true;
      }
      return false;
    }
    return Bytes.equals(qualifier, 0, qualifier.length,
        this.bytes, o + fl, ql);
  }


Image credit: Cloudera-blog

谢谢你的解释。你能把源链接也贴在这里吗?
<keylength> <valuelength> <key> <rowlength> <row> <columnfamilylength> <columnfamily> <columnqualifier> <timestamp> <keytype> <value>
if (!keyValue.matchingColumn(this.columnFamily, this.columnQualifier)) {
      return ReturnCode.INCLUDE;
    }

if (filterColumnValue(keyValue.getBuffer(), keyValue.getValueOffset(), keyValue.getValueLength())) {
      return this.latestVersionOnly? ReturnCode.NEXT_ROW: ReturnCode.INCLUDE;
}
  /**
   *
   * @param family column family
   * @param qualifier column qualifier
   * @return True if column matches
   */
  public boolean matchingColumn(final byte[] family, final byte[] qualifier) {
    int rl = getRowLength();
    int o = getFamilyOffset(rl);
    int fl = getFamilyLength(o);
    int ql = getQualifierLength(rl,fl);
    if (!Bytes.equals(family, 0, family.length, this.bytes, o, fl)) {
      return false;
    }
    if (qualifier == null || qualifier.length == 0) {
      if (ql == 0) {
        return true;
      }
      return false;
    }
    return Bytes.equals(qualifier, 0, qualifier.length,
        this.bytes, o + fl, ql);
  }


Image credit: Cloudera-blog