4

「users」というhbaseテーブルがあります。rowkeyは次の3つの部分で構成されています。

  1. ユーザーID
  2. messageid
  3. タイムスタンプ

行キーは次のようになります。${userid}_${messageid}_${timestamp}

ユーザーIDをハッシュしてフィールドの長さを固定できるとすると、とにかくSQLクエリのようなクエリを実行できますか?

select distinct(userid) from users

行キーでこのようにクエリを実行できない場合、それは、すべてのユーザーIDを含む個別のテーブルを作成する必要があることを意味しますか?そのようなことをすると、レコードを挿入するときにアトミックではなくなると思います。トランザクションなしで2つのテーブルを処理しているからです。

4

2 に答える 2

2

あなたはそれを行うことができますが、直接クエリではなく、マップ/リデュースジョブとして

于 2012-12-21T05:09:39.730 に答える
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

于 2012-12-20T20:47:10.153 に答える