如何通过 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 表数据的主要内容,如果未能解决你的问题,请参考以下文章
HBase REST 过滤器 ( SingleColumnValueFilter )