HBASE - 针对rowkey选择不同的查询

时间:2012-12-20 14:50:26

标签: hbase arrow-keys

我有一个名为“users”的hbase表,rowkey由三部分组成:

  1. 用户ID
  2. 的MessageID
  3. 时间戳
  4. rowkey看起来像是:${userid}_${messageid}_${timestamp}

    鉴于我可以散列用户标识并使字段的长度固定,无论如何我可以进行像SQL查询这样的查询:

    select distinct(userid) from users
    

    如果rowkey不允许我这样查询,这是否意味着我需要创建一个单独的表只包含所有用户ID?我想如果我做那样的事情,当我插入一条记录时,它就不再是原子的了,becoz我正在处理没有事务的两个表。

2 个答案:

答案 0 :(得分:1)

您可以这样做,但作为地图/减少作业而非直接查询

答案 1 :(得分:0)

你可以使用HashSet来做到这一点。像这样:

public Set<String> getDistinctCol(String tableName,String colFamilyName, String colName)
   {
    Set<String> set = new HashSet<String>();
    ResultScanner rs=null;
    Result r = null;
    String s = null;
    try 
    {
        HTable table = new HTable(conf, tableName);
        Scan scan = new Scan();
        scan.addColumn(Bytes.toBytes(colFamilyName),Bytes.toBytes(colName));
        rs = table.getScanner(scan);
        while((res=rs.next()) != null)
        {
            byte [] col = res.getValue(Bytes.toBytes(colFamilyName+":"+colName));                
            s = Bytes.toString(col);
            set.add(s);
        }
    } catch (IOException e) 
    {
        System.out.println("Exception occured in retrieving data");
    }
    finally
    {
        rs.close();
    }
    return set;

*你的案例中的col是userID。

HTH