package hip.ch5.hbase;
import hip.ch3.avro.gen.Stock;
import org.apache.avro.io.BinaryDecoder;
import org.apache.avro.io.DecoderFactory;
import org.apache.avro.specific.SpecificDatumReader;
import org.apache.commons.lang.builder.ToStringBuilder;
import org.apache.commons.lang.builder.ToStringStyle;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.*;
import org.apache.hadoop.hbase.client.*;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.net.URL;
import java.security.CodeSource;
public class HBaseScanAvroStock {
public static void main(String[] args) throws Exception {
Configuration conf = HBaseConfiguration.create();
HTable htable = new HTable(conf, HBaseWriter.STOCKS_TABLE_NAME);
ResultScanner scanner = htable.getScanner(
HBaseWriter.STOCK_DETAILS_COLUMN_FAMILY_AS_BYTES,
HBaseWriter.STOCK_COLUMN_QUALIFIER_AS_BYTES);
AvroStockReader reader = new AvroStockReader();
for(Result result: scanner) {
String rowkey = new String(result.getRow());
byte[] value = result.getValue(
HBaseWriter.STOCK_DETAILS_COLUMN_FAMILY_AS_BYTES,
HBaseWriter.STOCK_COLUMN_QUALIFIER_AS_BYTES);
Stock stock = reader.decode(value);
System.out.println("rowkey = '" + rowkey +
"' stock = '" +
ToStringBuilder
.reflectionToString(stock, ToStringStyle.SIMPLE_STYLE));
}
htable.close();
}
public static class AvroStockReader {
Stock stock;
BinaryDecoder decoder;
SpecificDatumReader<Stock> reader;
public AvroStockReader() {
reader = new SpecificDatumReader<Stock>(Stock.class);
CodeSource src = SpecificDatumReader.class.getProtectionDomain().getCodeSource();
if (src != null) {
URL jar = src.getLocation();
System.out.println("Loaded from " + jar);
}
}
public Stock decode(byte[] value) throws IOException {
ByteArrayInputStream bai = new ByteArrayInputStream(value);
decoder = DecoderFactory.get().directBinaryDecoder(bai, decoder);
stock = reader.read(stock, decoder);
return stock;
}
}
}