【问题标题】:Get value by family in HBase在 HBase 中按家庭获取价值
【发布时间】:2011-12-04 16:40:34
【问题描述】:

行:

Key, Family:Qualifier, Value
Key, Family1:Qualifier, Value
Key, Family2:Qualifier, Value
Key, FamilyN:Qualifier, Value

在 Java HBase API 中,我们可以逐行扫描一个表,然后为每一行获取一个FamilyMap

是否有任何选项可以在不知道 qualifier 的情况下获取特定 family 的所有行?

如果是,在性能方面是否有区别:按键获取价值或家庭获取价值?

【问题讨论】:

    标签: java hadoop hbase


    【解决方案1】:

    您可以像这样将扫描仪用于特定的家庭。获取特定列族的扫描仪仅返回该族数据作为结果的一部分。这意味着属于该系列的限定符和值可作为结果的一部分。

    HTable table = new HTable(HBaseConfiguration.create(), "tablename");
    Scan scan = new scan();
    scan.setCaching(NUMBER_OF_ROWS_TO_CACHE);
    //If you want to get data for all families then do not add any family.
    scan.addFamily(Bytes.toBytes("columnFamilyName"));
    ResultScanner scanner = table.getScanner(scan);
    

    如果您不向上面创建的scan 对象添加任何族,那么您将获得所有列族的数据。现在你可以像这样迭代扫描表了

    for (Result result = scanner.next(); (result != null); result = scanner.next()) {
        //If you want a family specific data
        NavigableMap familyMap = result.getFamilyMap(Bytes.toBytes("familyname"));
        //if you want to get the entire row 
        Get get = new Get(result.getRow());
        Result entireRow = table.get(get); 
    
    }
    

    至于获取所有行数据时的性能,它会比较慢,因为获取特定行的所有列族的所有数据。所以,除非你想让你所有的家人都得到整排。

    【讨论】:

    • 奇怪...你做了 table.get(get);为了得到一个结果,你已经在你的循环中得到了结果......(结果结果=scanner.next(),这是否意味着我们不能在没有钥匙的情况下按家庭获得一行?跨度>
    • @JohnJohnGa table.get(get) 获取包含所有列族数据的整行。让我编辑答案以使其更清楚。
    • 是的,你是对的。您无法按家庭获得特定行。 Family 是表模式的一部分。要获取特定行,您必须使用 rowkey 获取行,这就是 table.get(get) 所做的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-29
    • 1970-01-01
    • 2016-05-17
    • 1970-01-01
    相关资源
    最近更新 更多