【问题标题】:How to obtain Phoenix table data via HBase REST service如何通过 HBase REST 服务获取 Phoenix 表数据
【发布时间】: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 服务获取数据?

【问题讨论】:

    标签: rest hadoop jdbc hbase phoenix


    【解决方案1】:

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

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

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-03-26
        • 1970-01-01
        • 1970-01-01
        • 2012-06-10
        • 1970-01-01
        • 2018-12-19
        相关资源
        最近更新 更多