HBaseでは、hbase shell
コマンドを実行して起動できるインタラクティブシェル内において、下記のようにすることで文字列のバイト列をテーブルにputすることができます。
put 'my_table', 'foo', 'f:q', 'some_string'
文字列のみを扱うテーブルであればこれで問題ないのですが、たとえば数値を扱うテーブルの場合などで、putの引数として数値を渡した場合でも、数値が一旦文字列に変換されてから文字列のバイト列としてテーブルに書き込まれます。HBaseで数値を扱うJavaアプリケーションではorg.apache.hadoop.hbase.util.Bytes
クラスの変換メソッドを使ってLong型の値をバイト列に変換して書き込むというケースがよくありますが、HBase shell内で普通にputを行おうとすると、これと同様のことを行うことができません。
実は、HBase shell内でget_table
を呼び出し、その戻り値のtable
プロパティにアクセスすることでorg.apache.hadoop.hbase.client.HTable
インスタンスにアクセスすることができます。これに直接アクセスすることで、Javaアプリケーションと同様な操作を行えるようになります。
hbase(main):001:0> t = get_table('my_table').table
=> #<Java::OrgApacheHadoopHbaseClient::HTable:0x17b37e9a>
実際にこのHTable
インスタンスとBytes
クラスをつかって、数値を書き込んでみます。
hbase(main):001:0> import java.lang.Long
hbase(main):002:0> import org.apache.hadoop.hbase.util.Bytes
hbase(main):003:0> import org.apache.hadoop.hbase.client.Put
hbase(main):004:0> row = 'foo'
hbase(main):005:0> family = 'f'
hbase(main):006:0> qualifier = 'q'
hbase(main):007:0> t = get_table('my_table').table
=> #<Java::OrgApacheHadoopHbaseClient::HTable:0x7cfac39f>
hbase(main):008:0> p = Put.new(row.to_java_bytes).add(family.to_java_bytes, qualifier.to_java_bytes, Bytes.toBytes(Long.new(15)))
=> #<Java::OrgApacheHadoopHbaseClient::Put:0x2ead6ba4>
hbase(main):009:0> t.put(p)
org.apache.hadoop.hbase.client.Put
インスタンスを生成して、HTable#put
に渡しています。テーブルをscanしてみると、期待通りに書き込まれていることがわかります。
hbase(main):010:0> scan 'my_table'
ROW COLUMN+CELL
foo column=f:q, timestamp=1429359211800, value=\x00\x00\x00\x00\x00\x00\x00\x0F
1 row(s) in 0.0630 seconds
今回はputについて扱いましたが、HTable
インスタンスに直接アクセスする方法を覚えておけば、HBase shellの壁にぶつかった時により柔軟な操作を行えるようになるでしょう。