|
|
-
Scanning a row for certain md5hash does not work
Paul van Hoven 2013-02-19, 18:46
I'm currently reading a book about hbase (hbase in action by manning). In this book it is explained how to perform a scan if the rowkey is made out of a md5 hash (page 45 in the book). My rowkey design (and table filling method) looks like this:
SimpleDateFormat dateFormatter = new SimpleDateFormat("yyyy-MM-dd"); SimpleDateFormat timeFormatter = new SimpleDateFormat("HH:mm:ss"); Date date = dateFormatter.parse("2013-01-01");
for( int i = 0; i < 31; ++i ) { for( int k = 0; k < 24; ++k ) { for( int j = 0; j < 1; ++j ) { //md5() is a custom method that transforms a string into a md5 hash byte[] ts = md5( dateFormatter.format(date) ); byte[] tm = md5( timeFormatter.format(date) ); byte[] ip = md5( generateRandomIPAddress() /* toy method that generates ip addresses */ ); byte[] rowkey = new byte[ ts.length + tm.length + ip.length ]; System.arraycopy( ts, 0, rowkey, 0, ts.length ); System.arraycopy( tm, 0, rowkey, ts.length, tm.length ); System.arraycopy( ip, 0, rowkey, ts.length+tm.length, ip.length ); Put p = new Put( rowkey );
p.add( Bytes.toBytes("CF"), Bytes.toBytes("SampleCol"), Bytes.toBytes( "Value_" + (i+1) + " = " + dateFormatter.format(date) + " " + timeFormatter.format(date) ) ); toyDataTable.put( p ); } //custom method that adds an hour to the current date object date = addHours( date, 1 ); } }
Now I'd like to do the following scan (I more or less took the same code from the example in the book):
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); Date refDate = formatter.parse("2013-01-15");
HTableInterface toyDataTable = pool.getTable("ToyDataTable");
byte[] md5Key = md5( refDate.getTime() +"" ); int md5Length = 16; int longLength = 8; byte[] startRow = Bytes.padTail( md5Key, longLength ); byte[] endRow = Bytes.padTail( md5Key, longLength ); endRow[md5Length-1]++;
Scan scan = new Scan( startRow, endRow ); ResultScanner rs = toyDataTable.getScanner( scan ); for( Result r : rs ) { String value = Bytes.toString( r.getValue( Bytes.toBytes("CF"), Bytes.toBytes("SampleCol")) ); System.out.println( value ); }
The result is empty. How is that possible?
-
Re: Scanning a row for certain md5hash does not work
Paul van Hoven 2013-02-19, 19:13
Sorry, I had a mistake in my rowkey generation.
Thanks for reading!
2013/2/19 Paul van Hoven <[EMAIL PROTECTED]>: > I'm currently reading a book about hbase (hbase in action by manning). > In this book it is explained how to perform a scan if the rowkey is > made out of a md5 hash (page 45 in the book). My rowkey design (and > table filling method) looks like this: > > SimpleDateFormat dateFormatter = new SimpleDateFormat("yyyy-MM-dd"); > SimpleDateFormat timeFormatter = new SimpleDateFormat("HH:mm:ss"); > Date date = dateFormatter.parse("2013-01-01"); > > for( int i = 0; i < 31; ++i ) { > for( int k = 0; k < 24; ++k ) { > for( int j = 0; j < 1; ++j ) { > //md5() is a custom method that transforms a > string into a md5 hash > byte[] ts = md5( dateFormatter.format(date) ); > byte[] tm = md5( timeFormatter.format(date) ); > byte[] ip = md5( generateRandomIPAddress() /* toy method that > generates ip addresses */ ); > byte[] rowkey = new byte[ ts.length + tm.length + ip.length ]; > System.arraycopy( ts, 0, rowkey, 0, ts.length ); > System.arraycopy( tm, 0, rowkey, ts.length, tm.length ); > System.arraycopy( ip, 0, rowkey, ts.length+tm.length, ip.length ); > Put p = new Put( rowkey ); > > p.add( Bytes.toBytes("CF"), Bytes.toBytes("SampleCol"), > Bytes.toBytes( "Value_" + (i+1) + " = " + dateFormatter.format(date) + > " " + timeFormatter.format(date) ) ); > toyDataTable.put( p ); > } > > //custom method that adds an hour to the current date object > date = addHours( date, 1 ); > } > > } > > Now I'd like to do the following scan (I more or less took the same > code from the example in the book): > > SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); > Date refDate = formatter.parse("2013-01-15"); > > HTableInterface toyDataTable = pool.getTable("ToyDataTable"); > > byte[] md5Key = md5( refDate.getTime() +"" ); > int md5Length = 16; > int longLength = 8; > byte[] startRow = Bytes.padTail( md5Key, longLength ); > byte[] endRow = Bytes.padTail( md5Key, longLength ); > endRow[md5Length-1]++; > > Scan scan = new Scan( startRow, endRow ); > ResultScanner rs = toyDataTable.getScanner( scan ); > for( Result r : rs ) { > String value = Bytes.toString( r.getValue( Bytes.toBytes("CF"), > Bytes.toBytes("SampleCol")) ); > System.out.println( value ); > } > > The result is empty. How is that possible?
|
|