Предложение «где» запроса Гектора

Предположим, у меня есть таблица ClientHeaders со следующими столбцами

| UUID | Cliend_id | IP | Country | Date |

где UUID — первичный ключ.

Я хочу использовать этот запрос:

select * from ClientHeaders where Client_id = "123";

Как я могу это сделать, используя slicequery of hector.

Я знаю, было ли это так: select * from ClientHeaders where UUID= "123";

Следующее выполнило бы задачу:

sliceQuery.setColumnFamily("ClientHeaders");
sliceQuery.setKey("123");
sliceQuery.setRange("", "", false, 5);
QueryResult<ColumnSlice<String, String>> result = sliceQuery.execute(); 

поскольку UUID является первичным ключом, поэтому sliceQuery.setKey("123"); работает с первичным ключом. Можно ли каким-либо образом выполнить функциональность предложения where из непервичного ключа?


person Ryan Malhotra    schedule 12.06.2013    source источник


Ответы (1)


Для этого вам нужно использовать IndexedSlicesQuery.

StringSerializer stringSerializer = StringSerializer.get();
BytesArraySerializer bas = BytesArraySerializer.get();


IndexedSlicesQuery<String, String, byte[]> indexedSlicesQuery = 
            HFactory.createIndexedSlicesQuery("your keyspace", stringSerializer, stringSerializer, bas);

indexedSlicesQuery.setColumnFamily("ClientHeaders");
indexedSlicesQuery.setColumnNames("UUID","Cliend_id","IP","Country","Date");
indexedSlicesQuery.addEqualsExpression("Client_id", stringSerializer.toBytes("123"));

QueryResult<OrderedRows<String, String, byte[]>> result = indexedSlicesQuery.execute();
person Hardik Bhalani    schedule 12.06.2013
comment
Эй.. спасибо за ответ.. Но я получаю эту ошибку The method createIndexedSlicesQuery(Keyspace, Serializer<K>, Serializer<N>, Serializer<V>) in the type HFactory is not applicable for the arguments (String, StringSerializer, StringSerializer, BytesArraySerializer) - person Ryan Malhotra; 12.06.2013
comment
Я решил указанную выше ошибку, используя Keyspace keyspace =HFactory.createKeyspace("MyKeyspacename", cluster); Но теперь indexedSlicesQuery.execute(); выдает исключение: me.prettyprint.hector.api.exceptions.HInvalidRequestException: InvalidRequestException(why:No indexed columns present in index clause with operator EQ) - person Ryan Malhotra; 12.06.2013
comment
да, для этого вам нужно создать индекс для этого конкретного имени столбца, например. обновить семейство столбцов ClientHeaders с компаратором = UTF8Type и column_metadata= [{column_name: client_id, validation_class: LongType, index_type: KEYS}]; примечание: также укажите требуемые имена столбцов в запросе на обновление и/или внесите соответствующие изменения в соответствии с требованиями. - person Hardik Bhalani; 12.06.2013
comment
Это решило предыдущее исключение, но теперь выдает следующее: me.prettyprint.hector.api.exceptions.HInvalidRequestException: InvalidRequestException(why:[436c69656e745f4944]=[41622e43442e45462e4748] failed value validation (Expected 8 or 0 byte long (11))) - person Ryan Malhotra; 12.06.2013
comment
возможно, вы допустили ошибку при добавлении индекса к этому конкретному столбцу. = [{имя_столбца: client_id, validation_class: ваш класс проверки, index_name:client_id_idx, index_type:KEYS }]; также добавьте другие имена столбцов... с/без index_type:KEYS, если вы также хотите, чтобы другие имена столбцов в предложении «where» добавляли их с параметром index_type:KEYS - person Hardik Bhalani; 12.06.2013
comment
Большое спасибо .. теперь все работает .. Возможно, возникла проблема с настройкой семейства столбцов. Что ж, теперь я получаю результат в следующем формате: Rows({fb99f2d2-ba34-4ab0-92a1-c567fc08d242=Row(fb99f2d2-ba34-4ab0-92a1-c567fc08d242,ColumnSlice([HColumn(Client_ID=MyUser), HColumn(Country=India), HColumn(Date=27.05.2013-:31:55), HColumn(IP Address=111.222.33.44)]))}) Можно ли как-нибудь извлечь из него строку в переменных (например, String ip= IP_Address)? - person Ryan Malhotra; 12.06.2013
comment
for (Row‹String, String, String› row : result.get().getList()) { System.out.println(ваш ключ строки:+row.getKey()); System.out.println(ваш client_id :+row.getColumnSlice().getColumnByName(client_id).getValue()); System.out.println(ваш ip :+row.getColumnSlice().getColumnByName(ip).getValue()); } - person Hardik Bhalani; 12.06.2013