如何通过HBase REST服务获取Phoenix表数据

时间:2016-06-28 07:52:12

标签: rest hadoop jdbc hbase phoenix

我在下面的代码片段中使用Phoenix JDBC Driver创建了一个HBase表:

    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 REST服务获取表数据,因为我从“本机”HBase编程中知道它。

网址http://server-url:12345/PHOENIXTEST/schema正常工作,并返回请求的表信息。

但是当我尝试例如http://server-url:12345/PHOENIXTEST/5(5是第一个插入行的键,请参阅上面的代码),我收到一条Not found消息。

如何通过HBase REST服务获取数据?

2 个答案:

答案 0 :(得分:1)

您可能对Phoenix如何编码存储在HBase表中的数据以及本机REST API尝试查找密钥的方式存在问题。

查看关于BIGINT的data types的Phoenix文档,它说:

  

二进制表示为8字节长,符号位翻转   (以便负值在正值之前排序)。

所以你应该看一下实际插入到你表中的内容。 HBase REST API可能正在使用不同的编码来查找密钥,因此无法找到它。

答案 1 :(得分:1)

你真的应该使用phoenix而不是HBase从phoenix表中获取你的数据。 Phoenix使用的是自定义编码,IntegerBigInt也是salting(如果您使用的话)。

Phoenix还主要使用byte来存储数据,使用StringBinary来编码它。所以,很有可能你的密钥不是5但是\ x80 \ x00 \ x00 \ x05(整数)