Home > Database > Mysql Tutorial > body text

HBase源码分析之GET操作之get转化为scan

WBOY
Release: 2016-06-07 17:25:04
Original
966 people have browsed it

HBase源码分析之GET操作之get转化为scan 1,还是先看构造函数 public Get(byte [] row) { this(row, null); } public Ge

HBase源码分析之GET操作之get转化为scan

1,还是先看构造函数

  public Get(byte [] row) {
    this(row, null);
  }


  public Get(byte [] row, RowLock rowLock) {
    this.row = row;
    if(rowLock != null) {
      this.lockId = rowLock.getLockId();
    }
  }

  public Get addFamily(byte [] family) {
    familyMap.remove(family);
    familyMap.put(family, null);
    return this;
  }

 

  public Get addColumn(byte [] family, byte [] qualifier) {
    NavigableSet set = familyMap.get(family);
    if(set == null) {
      set = new TreeSet(Bytes.BYTES_COMPARATOR);
    }
    set.add(qualifier);
    familyMap.put(family, set);
    return this;


  public Get addColumn(final byte [] column) {
    if (column == null) return this;
    byte [][] split = KeyValue.parseColumn(column);
    if (split.length > 1 && split[1] != null && split[1].length > 0) {
      addColumn(split[0], split[1]);
    } else {
      addFamily(split[0]);
    }
    return this;
  }


2,HTable.java  里的get方法,,实则是调用了HregionServer的get方法。

  public Result get(final Get get) throws IOException {
    return connection.getRegionServerWithRetries(
        new ServerCallable(connection, tableName, get.getRow()) {
          public Result call() throws IOException {
            return server.get(location.getRegionInfo().getRegionName(), get);
          }
        }
    );
  }


3,再来看看HregionServer.java

  /** {@inheritDoc} */
  public Result get(byte[] regionName, Get get) throws IOException {
    checkOpen();
    requestCount.incrementAndGet();
    try {
      HRegion region = getRegion(regionName);
      return region.get(get, getLockFromId(get.getLockId()));
    } catch (Throwable t) {
      throw convertThrowableToIOE(cleanup(t));
    }
  }

再来看看Hregion的get方法:

1),首先是检测family,保证Table中的family与get中的一致

  public Result get(final Get get, final Integer lockid) throws IOException {
    // Verify families are all valid
    if (get.hasFamilies()) {
      for (byte [] family: get.familySet()) {
        checkFamily(family);
      }
    } else { // Adding all families to scanner
      for (byte[] family: regionInfo.getTableDesc().getFamiliesKeys()) {
        get.addFamily(family);
      }
    }
    List result = get(get);


    return new Result(result);
  }


最终GET其实是转化为scan了

 /*
  * Do a get based on the get parameter.
  */
  private List get(final Get get) throws IOException {
    Scan scan = new Scan(get);


    List results = new ArrayList();


    InternalScanner scanner = null;
    try {
      scanner = getScanner(scan);
      scanner.next(results);
    } finally {
      if (scanner != null)
        scanner.close();
    }
    return results;
  }

linux

Related labels:
source:php.cn
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
About us Disclaimer Sitemap
php.cn:Public welfare online PHP training,Help PHP learners grow quickly!