You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何统计HBase中每个列族下包含的列总数量

HBase表各列族下列总数量统计方案

方案1:通过HBase Shell快速统计

适用于小表快速查询的场景:

  • 统计列族f的去重列名总数量(同一列不管有多少版本、出现在多少行,只计数1次)
echo "scan 'T', {COLUMNS => 'f', VERSIONS => 1}" | hbase shell | awk -F 'column=f:' '{if($2) print $2}' | awk -F '=' '{print $1}' | sort -u | wc -l
  • 统计列族m的去重列名总数量
echo "scan 'T', {COLUMNS => 'm', VERSIONS => 1}" | hbase shell | awk -F 'column=m:' '{if($2) print $2}' | awk -F '=' '{print $1}' | sort -u | wc -l

特殊统计场景调整:如果需要统计所有列的条目总数(含同一列的多版本、多行行级重复),直接去掉命令中的sort -u参数即可。

方案2:通过Java API代码实现

适用于大表统计、或者需要集成到业务逻辑的场景,核心逻辑是遍历目标列族的所有单元格,去重后计数:

import org.apache.hadoop.hbase.*;
import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.hbase.util.Bytes;
import java.util.HashSet;
import java.util.Set;

public class CountHBaseColumns {
    public static void main(String[] args) throws Exception {
        Configuration conf = HBaseConfiguration.create();
        // 按需配置HBase集群ZK地址
        conf.set("hbase.zookeeper.quorum", "你的ZK节点地址");
        Connection conn = ConnectionFactory.createConnection(conf);
        Table table = conn.getTable(TableName.valueOf("T"));

        // 统计f列族的去重列数量
        Scan scanF = new Scan();
        scanF.addFamily(Bytes.toBytes("f"));
        scanF.setMaxVersions(1); // 每个列只取1个版本实现去重
        ResultScanner scannerF = table.getScanner(scanF);
        Set<String> fColumns = new HashSet<>();
        for (Result res : scannerF) {
            res.rawCells().forEach(cell -> fColumns.add(Bytes.toString(CellUtil.cloneQualifier(cell))));
        }
        System.out.println("列族f的列总数量:" + fColumns.size());
        scannerF.close();

        // 统计m列族逻辑同上,替换列族名称即可
        Scan scanM = new Scan();
        scanM.addFamily(Bytes.toBytes("m"));
        scanM.setMaxVersions(1);
        ResultScanner scannerM = table.getScanner(scanM);
        Set<String> mColumns = new HashSet<>();
        for (Result res : scannerM) {
            res.rawCells().forEach(cell -> mColumns.add(Bytes.toString(CellUtil.cloneQualifier(cell))));
        }
        System.out.println("列族m的列总数量:" + mColumns.size());
        scannerM.close();

        table.close();
        conn.close();
    }
}

注意事项

  • 表数据量超过100万行时,不建议直接使用Shell的scan方案,会占用大量集群IO资源,可改用MapReduce任务或者HBase协处理器做异步统计
  • 如果只需要统计指定行范围的列,可在Scan对象中添加startRow、stopRow参数缩小扫描范围

内容的提问来源于stack exchange,提问作者khubeb

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 01:48:02