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

Posted

技术标签:

【中文标题】如何通过 HBase REST 服务获取 Phoenix 表数据【英文标题】:How to obtain Phoenix table data via HBase REST service 【发布时间】:2016-10-30 10:18:08 【问题描述】:

我使用 Phoenix JDBC Driver 在以下代码 sn-p 中创建了一个 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 编程中知道它。

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

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

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

【问题讨论】:

【参考方案1】:

您可能对 Phoenix 如何对存储在 HBase 表中的数据进行编码,而不是原生 REST API 如何尝试查找密钥存在疑问。

查看data types 上的 Phoenix 文档以获取 BIGINT,它说:

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

因此,您可能应该看看实际插入到表中的内容。 HBase REST API 可能正在寻找使用不同编码的密钥,因此找不到它。

【讨论】:

【参考方案2】:

您确实应该使用 phoenix 而不是 HBase 从 phoenix 表中获取数据。 Phoenix 使用的是自定义编码,因为它是 Integer 和 BigInt 以及 salting(如果你使用的话)。

Phoenix 也主要使用 byte 存储数据,使用 StringBinary 对其进行编码。因此,您的密钥很可能不是 5,而是 \x80\x00\x00\x05(Integer)

【讨论】:

以上是关于如何通过 HBase REST 服务获取 Phoenix 表数据的主要内容,如果未能解决你的问题,请参考以下文章

phoenixrc5.5报错

HBase REST 返回 json 而不是 xml

Hbase Stargate 返回打乱的值

HBase REST 过滤器 ( SingleColumnValueFilter )

如何使用 Stargate REST API 在 HBase 中构建更复杂的过滤器层次结构?

hbase权威指南第四版 中文 pdf 完整版下载