HBase:HBase如何知道行是否包含特定列
HBase如何知道行是否包含特定列?例如,考虑以下情况: 假设我们有一个表,它有一个名为“STAT_FAM”的列族,有以下两行: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(
- 一行,键为“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