
# 使用Scan读取HBase冷热分离数据
#### 功能介绍
要从表中读取数据，首先需要实例化该表对应的Table实例，然后创建一个Scan对象，并针对查询条件设置Scan对象的参数值，为了提高查询效率，最好指定StartRow和StopRow。查询结果的多行数据保存在ResultScanner对象中，每行数据以Result对象形式存储，Result中存储了多个Cell。
#### 代码样例
- 不指定HOT_ONLY参数来查询数据。在这种情况下，将会查询冷存储中的数据。
  ```
  public void testScanData() {
    LOG.info("Entering testScanData.");
    Table table = null; 
    // Instantiate a ResultScanner object.
    ResultScanner rScanner = null;
    try {
      // Create the Configuration instance.
      table = conn.getTable(tableName);
      // Instantiate a Get object.
      Scan scan = new Scan();
      byte[] startRow = Bytes.toBytes(Shenzhen#Longgang#2017/7/1 00:00:00);  
      byte[] stopRow = Bytes.toBytes(Shenzhen#Longgang#2017/7/3 00:00:00);
      scan.setStartRow(startRow);  
      scan.setStopRow(stopRow);
      scan.addColumn(Bytes.toBytes("info"), Bytes.toBytes("temp"));
      // Set the cache size.
      scan.setCaching(1000);
      // Submit a scan request.
      rScanner = table.getScanner(scan);
      // Print query results.
      for (Result r = rScanner.next(); r != null; r = rScanner.next()) {
        for (Cell cell : r.rawCells()) {
          LOG.info(Bytes.toString(CellUtil.cloneRow(cell)) + ":"
              + Bytes.toString(CellUtil.cloneFamily(cell)) + ","
              + Bytes.toString(CellUtil.cloneQualifier(cell)) + ","
              + Bytes.toString(CellUtil.cloneValue(cell)));
        }
      }
      LOG.info("Scan data successfully.");
    } catch (IOException e) {
      LOG.error("Scan data failed " ,e);
    } finally {
      if (rScanner != null) {
        // Close the scanner object.
        rScanner.close();
      }
      if (table != null) {
        try {
          // Close the HTable object.
          table.close();
        } catch (IOException e) {
          LOG.error("Close table failed " ,e);
        }
      }
    }
    LOG.info("Exiting testScanData.");
  }
  ```
  

- 通过指定HOT_ONLY参数来查询数据。在这种情况下，只会查询热存储中的数据。
  ```
  public void testScanData() {
    LOG.info("Entering testScanData.");
    Table table = null; 
    // Instantiate a ResultScanner object.
    ResultScanner rScanner = null;
    try {
      // Create the Configuration instance.
      table = conn.getTable(tableName);
      // Instantiate a Get object.
      Scan scan = new Scan();
      byte[] startRow = Bytes.toBytes(Shenzhen#Longgang#2017/7/1 00:00:00);  
      byte[] stopRow = Bytes.toBytes(Shenzhen#Longgang#2017/7/3 00:00:00);
      scan.setStartRow(startRow);  
      scan.setStopRow(stopRow);
      scan.addColumn(Bytes.toBytes("info"), Bytes.toBytes("temp"));
      // Set HOT_ONLY.
      scan.setAttribute(HBaseConstants.HOT_ONLY, Bytes.toBytes(true));
      // Set the cache size.
      scan.setCaching(1000);
      // Submit a scan request.
      rScanner = table.getScanner(scan);
      // Print query results.
      for (Result r = rScanner.next(); r != null; r = rScanner.next()) {
        for (Cell cell : r.rawCells()) {
          LOG.info(Bytes.toString(CellUtil.cloneRow(cell)) + ":"
              + Bytes.toString(CellUtil.cloneFamily(cell)) + ","
              + Bytes.toString(CellUtil.cloneQualifier(cell)) + ","
              + Bytes.toString(CellUtil.cloneValue(cell)));
        }
      }
      LOG.info("Scan data successfully.");
    } catch (IOException e) {
      LOG.error("Scan data failed " ,e);
    } finally {
      if (rScanner != null) {
        // Close the scanner object.
        rScanner.close();
      }
      if (table != null) {
        try {
          // Close the HTable object.
          table.close();
        } catch (IOException e) {
          LOG.error("Close table failed " ,e);
        }
      }
    }
    LOG.info("Exiting testScanData.");
  }
  ```
  
 
