Hbase - 按列名前缀获取行的列名

Posted

技术标签:

【中文标题】Hbase - 按列名前缀获取行的列名【英文标题】:Hbase - get column names for row by column name prefix 【发布时间】:2014-03-31 06:42:50 【问题描述】:

我有一个带有以下描述的 Hbase 表。

对于行键,我的列将采用 a_1、a_2、a_3、b_1、c_1、C_2 等形式,这是一种复合键格式。

假设我的行之一是形式

row key - row1
column family - c1
columns - a_1, a_2,a_3,b_1,b_2,c_1,C_2,d_9,d_99

我可以通过任何操作将 a、b、c、d 检索为与 row1 对应的列吗,我不关心 a、b、c 的后缀是什么...

我可以获取给定行的所有列名,通过将行键按第一部分拆分并将它们添加到集合中并发出集合。我很担心,如果有更好的方法通过过滤器或其他一些 hbase 方法来完成它,请评论...

【问题讨论】:

将我的 rowkey 更改为 rowkey_columnpart1_columnpart2 会更好吗? 有一个前缀过滤器,因此您将获得所有以某个前缀(a b 或 c)开头的列,这有帮助吗? @Udy 这里的问题是我之前没有给定行键的列名信息。 好的,我现在知道了。在这种情况下,除了按照您的建议之外,别无选择。 @Udy 谢谢你......请稍后再写,以防你找到不同的方式。 【参考方案1】:

您可以为此使用 COlumnPrefixFilter。可以看到如下代码

    Configuration hadoopConf = new Configuration();
    hadoopConf.set("hbase.zookeeper.quorum", "localhost");
    hadoopConf.set("hbase.zookeeper.property.clientPort", "2181");

    HTable hTable = new HTable(hadoopConf, "KunderaExamples");

    Scan scan = new Scan();
    scan.setFilter(new ColumnPrefixFilter("A".getBytes()));
    ResultScanner scanner = hTable.getScanner(scan);
    Iterator<Result> resultsIter = scanner.iterator();
    while (resultsIter.hasNext())
    

        Result result = resultsIter.next();

        List<KeyValue> values = result.list();
        for (KeyValue value : values)
        
            System.out.println(value.getKey());
            System.out.println(new String(value.getQualifier()));
            System.out.println(value.getValue());
        
    

【讨论】:

为此我需要知道我的行键有一些以 A 开头的列。这里的问题是给定行键的列名对我来说是未知的。 按照上面的代码,它只是对所有以 A 开头的列执行扫描(我可以在这里做一个 get 而不是扫描,我有行键)。除非我执行获取和比较,否则这里没有运行时分辨率的规定。这与我的要求相去甚远。 @kkmishra,我想我没明白你的意思。你能详细说明一下吗?

以上是关于Hbase - 按列名前缀获取行的列名的主要内容,如果未能解决你的问题,请参考以下文章

MySQL - 在 SELECT 语句中的列名之前添加文本前缀

如何在 Power BI 中动态获取列名?

在连接共享某些列名的两个表时,是不是有一种动态方法可以为一个表的所有列名添加前缀?

如何通过列名的前缀对火花数据框进行子集化?

添加列名作为特定列的前缀

对列名排序后转置和添加前缀的宏