HBASE - выбрать отдельный запрос для ключа строки
У меня есть таблица hbase под названием "пользователи", rowkey состоит из трех частей:
- Идентификатор пользователя
- MessageId
- отметка времени
rowkey выглядит так: ${userid}_${messageid}_${timestamp}
Учитывая, что я могу хэшировать идентификатор пользователя и сделать длину поля фиксированной, есть ли возможность выполнить запрос, подобный SQL-запросу:
select distinct(userid) from users
Если rowkey не позволяет мне делать подобные запросы, значит ли это, что мне нужно создать отдельную таблицу, содержащую только идентификаторы пользователей? Я предполагаю, что если я сделаю что-то подобное, это не будет атомарным, когда я вставлю запись в, потому что я имею дело с двумя таблицами без транзакций.
2 ответа
Вы можете сделать это, но в качестве карты / сокращения работы, а не прямой запрос
Вы можете использовать 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.
НТН