You are viewing a plain text version of this content. The canonical link for it is here.
Posted to user@hbase.apache.org by Paul van Hoven <pa...@googlemail.com> on 2013/02/19 19:46:24 UTC

Scanning a row for certain md5hash does not work

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

Posted by Paul van Hoven <pa...@googlemail.com>.
Sorry, I had a mistake in my rowkey generation.

Thanks for reading!

2013/2/19 Paul van Hoven <pa...@googlemail.com>:
> 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?