Simple HBase ORM

When dealing with data stored in HBase, you are quick to come to a conclusion, that it is extremaly inconvenient to reach to it via HBase native API. It is very verbose and you always need to convert between bytes and simple types – a pain. While I wa…When dealing with data stored in HBase, you are quick to come to a conclusion, that it is extremaly inconvenient to reach to it via HBase native API. It is very verbose and you always need to convert between bytes and simple types – a pain. While I wa…

When dealing with data stored in HBase, you are quick to come to a
conclusion, that it is extremaly inconvenient to reach to it
via HBase native API. It is very verbose and you always need to convert
between bytes and simple types – a pain.

While I was working on a project of mine, I thought, why not to easy
those pains and fetch real objects from HBase.

And that’s how this simplistic, hackish ORM came to life. It is no match
for projects like Kundera
(a JPA compliant solution), or n-orm. Nevertheless, it just suits my needs :)

Project sources are hosted on GitHub: https://github.com/zygm0nt/hbase-annotations

To make use of this, you need to have an entity class with annotations:

  • @Column – with argument specifying column family and column name, ie.
    @Column(“cf:column-name”)
  • @Id – will store row key in this property,
  • and optionaly @Value – for Spring Expression Language, in case you
    need to perform some extraction on the value.

Annotations should be on setter methods.

Now you have your model annotated and ready to be fetched from HBase.

The actual work is done with a service class, that should extend class
BaseHadoopInteraction just as class
SimpleHBaseClient does.

Then it is possible to just call:

Note that there are more methods you can use on BaseHadoopInteraction.
You can also do:

  • scan
  • scan with key ranges
  • delete

What you won’t get from this simple ORM is:

  • automatic object updating,
  • nested objects,
  • saving to HBase – ’cause I didn’t have a need for that,

Hope you’ll find this piece of code useful. If you see room for
improvements while staying in project’s scope – please drop me a
message.

And if you are searching for a full-fledged ORM solution for interacting with HBase, just head
straight to Kundera project website :)

You May Also Like

Need to make a quick json fixes – JSONPath for rescue

From time to time I have a need to do some fixes in my json data. In a world of flat files I do this with grep/sed/awk tool chain. How to handle it for JSON? Searching for a solution I came across the JSONPath. It quite mature tool (from 2007) but I haven't hear about it so I decided to share my experience with others.

First of all you can try it without pain online: http://jsonpath.curiousconcept.com/. Full syntax is described at http://goessner.net/articles/JsonPath/



But also you can download python binding and run it from command line:
$ sudo apt-get install python-jsonpath-rw
$ sudo apt-get install python-setuptools
$ sudo easy_install -U jsonpath

After that you can use inside python or with simple cli wrapper:
#!/usr/bin/python
import sys, json, jsonpath

path = sys.argv[
1]

result = jsonpath.jsonpath(json.load(sys.stdin), path)
print json.dumps(result, indent=2)

… you can use it in your shell e.g. for json:
{
"store": {
"book": [
{
"category": "reference",
"author": "Nigel Rees",
"title": "Sayings of the Century",
"price": 8.95
},
{
"category": "fiction",
"author": "Evelyn Waugh",
"title": "Sword of Honour",
"price": 12.99
},
{
"category": "fiction",
"author": "Herman Melville",
"title": "Moby Dick",
"isbn": "0-553-21311-3",
"price": 8.99
},
{
"category": "fiction",
"author": "J. R. R. Tolkien",
"title": "The Lord of the Rings",
"isbn": "0-395-19395-8",
"price": 22.99
}
],
"bicycle": {
"color": "red",
"price": 19.95
}
}
}

You can print only book nodes with price lower than 10 by:
$ jsonpath '$..book[?(@.price 

Result:
[
{
"category": "reference",
"price": 8.95,
"title": "Sayings of the Century",
"author": "Nigel Rees"
},
{
"category": "fiction",
"price": 8.99,
"title": "Moby Dick",
"isbn": "0-553-21311-3",
"author": "Herman Melville"
}
]

Have a nice JSON hacking!From time to time I have a need to do some fixes in my json data. In a world of flat files I do this with grep/sed/awk tool chain. How to handle it for JSON? Searching for a solution I came across the JSONPath. It quite mature tool (from 2007) but I haven't hear about it so I decided to share my experience with others.