2016-06-28 8 views
2

経由フェニックス・テーブル・データを取得するためにどのように私は次のコードスニペットにフェニックスJDBCドライバを使用して、HBaseのテーブルを作成しました:は、HBaseのRESTサービス

Class.forName("org.apache.phoenix.jdbc.PhoenixDriver"); 
    Connection conn = DriverManager.getConnection("jdbc:phoenix:serverurl:/hbase-unsecure"); 
    System.out.println("got connection"); 

    conn.createStatement().execute("CREATE TABLE IF NOT EXISTS phoenixtest (id BIGINT not null primary key, test VARCHAR)"); 

    int inserted = conn.createStatement().executeUpdate("UPSERT INTO phoenixtest VALUES (5, '13%')"); 
    conn.commit(); 

    System.out.println("Inserted or updated " + inserted + " rows"); 

    ResultSet rst = conn.createStatement().executeQuery("select * from phoenixtest"); 

    while (rst.next()) { 
     System.out.println(rst.getString(1) + " " + rst.getString(2)); 
    } 

テーブルが作成され、テーブル・ループが正常に動作しています。

今、私は "ネイティブ" HBaseプログラミングからそれを知っているので、HBase RESTサービス経由でテーブルデータを取得しようとしました。

url http://server-url:12345/PHOENIXTEST/schemaは正常に動作し、要求されたテーブル情報を返します。

しかし、私が試したときなどhttp://server-url:12345/PHOENIXTEST/5(上記のコードを参照してください、最初に挿入された行のキーは5でした)、私はNot foundメッセージを返します。

どのようにしてHBase RESTサービス経由でデータを取得できますか?

答えて

1

フェニックスがHBaseテーブルに保存するデータをエンコードする方法、ネイティブREST APIがキーを見つけようとする方法などの問題があります。 BIGINTのためdata types上のフェニックスのドキュメントを見てみると

それは言う:

バイナリ表現は、(負の値が正の値の前にソートされるように)、符号ビットと長い8バイトが を反転しています。

実際にあなたのテーブルに実際に何が挿入されたかを見てください。 HBase REST APIは、おそらく異なるエンコーディングを使用しているキーを探しているため、見つけられません。

1

フェニックステーブルからのデータは、HBaseではなくphoenixを使用して取得する必要があります。 Phoenixの使用方法は、IntegerBigIntでもsalting(これを使用する場合)のカスタムエンコードです。

フェニックスも、データを格納するためのバイトとそれをエンコードするためのStringBinaryを使用します。だから、あなたの鍵は5ではなく、\ x80 \ x00 \ x00 \ x05(整数)のチャンスがたくさんあります