package org.apache.hadoop.hbase.regionserver.pbase; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.hadoop.fs.Path; import org.apache.hadoop.hbase.Cell; import org.apache.hadoop.hbase.client.Put; import org.apache.hadoop.hbase.client.Scan; import org.apache.hadoop.hbase.regionserver.PStoreScanner; import org.apache.hadoop.hbase.regionserver.RecordScanner; import org.apache.hadoop.hbase.regionserver.memstore.PMemStore; import org.apache.hadoop.hbase.regionserver.memstore.PMemStoreImpl; import org.apache.hadoop.hbase.regionserver.pbase.util.ParquetReadUtil; import org.apache.hadoop.hbase.util.Bytes; import org.junit.Assert; import org.junit.Test; import java.io.IOException; import java.util.LinkedList; import java.util.List; /** * Created by wangxiaoyi on 15/7/2. */ public class TestPStoreScanner { private static final Log LOG = LogFactory.getLog(TestPStoreScanner.class); public static Path rootPath = new Path("hdfs://localhost:9000/parquet"); public static List<Path> paths = ParquetReadUtil.loadParquetFiles(new Path(rootPath, "pfile")); /** * init the memstore scanner * @return */ public static RecordScanner getMemStoreScanner(){ RecordScanner scanner = null; PMemStore memStore = new PMemStoreImpl(null); final int ROWS_LEN = 100; for(int i = 501 ; i <= 500 + ROWS_LEN; ++i){ Put put = new Put(String.format("%10d", i).getBytes()); put.addColumn(Bytes.toBytes("cf"), Bytes.toBytes("name"), ("wangxiaoyi" + i).getBytes()); put.addColumn(Bytes.toBytes("cf"), Bytes.toBytes("age"), ("age" + i).getBytes()); put.addColumn(Bytes.toBytes("cf"), Bytes.toBytes("job"), ("student" + i).getBytes()); try { memStore.add(put); }catch (IOException ioe){ ioe.printStackTrace(); } } scanner = memStore.getScanner(null); return scanner; } @Test public void testIterate(){ List<RecordScanner> scanners = new LinkedList<>(); scanners.add(getMemStoreScanner()); List<RecordScanner> pscanners = ParquetReadUtil.getParquetFileScanner(paths, null); scanners.addAll(pscanners); int start = 1, end = 600; Scan scan = new Scan(String.format("%10d", start).getBytes()); scan.setStopRow(String.format("%10d", end + 1).getBytes()); PStoreScanner scanner = new PStoreScanner(null, scan, 0l, scanners); for(; start <= end; ++ start){ Assert.assertEquals(true, scanner.hasNext()); List<Cell> peek = scanner.peek(); Assert.assertEquals(false, peek.isEmpty()); String peekRow = Bytes.toString(peek.get(0).getRow()); Assert.assertEquals(String.format("%10d", start), peekRow); List<Cell> result = scanner.next(); Assert.assertEquals(false, result.isEmpty()); String resultRow = Bytes.toString(result.get(0).getRow()); Assert.assertEquals(String.format("%10d", start), resultRow); } } @Test public void testClose(){ List<RecordScanner> scanners = new LinkedList<>(); scanners.add(getMemStoreScanner()); List<RecordScanner> pscanners = ParquetReadUtil.getParquetFileScanner(paths, null); scanners.addAll(pscanners); int start = 1, end = 600; Scan scan = new Scan(String.format("%10d", start).getBytes()); scan.setStopRow(String.format("%10d", end + 1).getBytes()); PStoreScanner scanner = new PStoreScanner(null, scan, 0l, scanners); for(; start <= end; ++ start){ if(start == 16) { Assert.assertEquals(false, scanner.hasNext()); break; } Assert.assertEquals(true, scanner.hasNext()); List<Cell> peek = scanner.peek(); Assert.assertEquals(false, peek.isEmpty()); String peekRow = Bytes.toString(peek.get(0).getRow()); Assert.assertEquals(String.format("%10d", start), peekRow); List<Cell> result = scanner.next(); Assert.assertEquals(false, result.isEmpty()); String resultRow = Bytes.toString(result.get(0).getRow()); Assert.assertEquals(String.format("%10d", start), resultRow); if(start == 15){ scanner.close(); } } } @Test public void testIterateWithStartKeyAndStopKey(){ List<RecordScanner> scanners = new LinkedList<>(); scanners.add(getMemStoreScanner()); List<RecordScanner> pscanners = ParquetReadUtil.getParquetFileScanner(paths, null); scanners.addAll(pscanners); int start = 1, end = 600; Scan scan = new Scan(); //scan.setStartRow(String.format("%10d", start).getBytes()); scan.setStopRow(String.format("%10d", end + 1).getBytes()); PStoreScanner scanner = new PStoreScanner(null, scan, 0l, scanners); for(; start <= end; ++ start){ Assert.assertEquals(true, scanner.hasNext()); List<Cell> peek = scanner.peek(); Assert.assertEquals(false, peek.isEmpty()); String peekRow = Bytes.toString(peek.get(0).getRow()); Assert.assertEquals(String.format("%10d", start), peekRow); List<Cell> result = scanner.next(); Assert.assertEquals(false, result.isEmpty()); String resultRow = Bytes.toString(result.get(0).getRow()); Assert.assertEquals(String.format("%10d", start), resultRow); } } }