【问题标题】:Filter using HBase REST API使用 HBase REST API 过滤
【发布时间】:2017-08-24 14:16:36
【问题描述】:

有人知道 HBase REST API 吗?我目前正在编写一个使用 curl 命令从 HBase 插入和读取的程序。尝试阅读时,我使用 curl get 命令,例如

curl -X GET 'http://server:9090/test/Row-1/Action:ActionType/' -h 'Accept:application/json'

这会从第 1 行返回列 Action:ActionType。但是,如果我想使用 GET 命令执行 WHERE 子句的等效操作,我会被卡住。我不确定它甚至可能吗?例如,如果我想查找 Action:ActionType =1 的所有记录。 感谢您的帮助!

【问题讨论】:

    标签: rest curl hbase


    【解决方案1】:

    您可以通过在 CURL 请求中使用过滤器(此处为 SingleColumnValueFilter)来做到这一点。

    首先,创建一个描述您的扫描的 XML 文件 (myscanner.xml)。这里我们要根据限定符值进行过滤,使用EQUAL运算符):

    <Scanner batch="10">
        <filter>
            {
                "type": "SingleColumnValueFilter",
                "op": "EQUAL",
                "family": "<FAMILY_BASE64>",
                "qualifier": "<QUALIFIER_BASE64>",
                "latestVersion": true,
                "comparator": {
                    "type": "BinaryComparator",
                    "value": "<SEARCHED_VALUE_BASE64>"
                }
            }
        </filter>
    </Scanner>
    

    你应该用你自己的值替换&lt;FAMILY_BASE64&gt;&lt;QUALIFIER_BASE64&gt;&lt;SEARCHED_VALUE_BASE64&gt;(值必须转换为base64,你可以做echo -en ${FAMILY} | base64

    然后,使用此 XML 文件作为数据向 HBase REST API 提交 CURL 请求:

    curl -vi -X PUT \
        -H "Content-Type:text/xml" \
        -d @myscanner.xml \
        "http://${HOST}:${REST_API_PORT}/${TABLE_NAME}/scanner/"
    

    这个请求应该返回一个 Scanner 对象,比如:

    [...]
    Location: http://${HOST}:${REST_API_PORT}/${TABLE_NAME}/scanner/149123344543470bea57a
    

    然后使用给定的扫描器对结果进行迭代(多次请求迭代):

    curl -vi -X GET \
        -H "Accept: text/xml" \
        "http://${HOST}:${REST_API_PORT}/${TABLE_NAME}/scanner/149123344543470bea57a"
    

    您也可以接受"application/json" 而不是 XML。请注意,结果是 base64 编码的。

    来源:

    HBase REST Filter ( SingleColumnValueFilter )

    您可以使用的过滤器列表:https://gist.github.com/stelcheck/3979381

    关于 HBase REST API 的 Cloudera 文档:https://www.cloudera.com/documentation/enterprise/5-9-x/topics/admin_hbase_rest_api.html

    【讨论】:

    • 这会返回多行吗?我需要返回多行有限制。例如 15 行或某个时间范围内的行。
    • 是的,正如我提到的,您可以遍历扫描仪结果以获取多行。
    • 当我遍历时,它只会给我该行的其他列
    • 如果scanner 标记中的batch 参数太小(与您的限定符数量相比),在迭代时可能看起来扫描器总是返回同一行的结果。但实际上,如果你迭代得足够多,你肯定会看到其他行。尝试在扫描仪中添加此过滤器&lt;filter&gt;{"type": "FirstKeyOnlyFilter"}&lt;/filter&gt;(仅保留行键)以验证确实返回了多行。
    • 它说内容长度:0
    猜你喜欢
    • 2012-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多