УДАЛИТЬ строки, хранящиеся на определенном узле

Как мне написать CQL 3 DELETE спецификацию строки (предложение WHERE), которая будет выбирать только те строки, которые хранятся на данном узле? Если это невозможно, существует ли SELECT отношение (предложение WHERE), указывающее, какие строки хранятся на конкретном узле?

Я хочу сделать это, чтобы демон обслуживания (на Java) работал на каждом узле хранилища данных, который удаляет старые записи с этого узла, чтобы убедиться, что его узлу не хватает места на диске. Поскольку я пишу демон, а не выполняю одноразовую очистку, нецелесообразно использовать программу nodetool для запроса диапазонов токенов, хранящихся на узле.


person Raedwald    schedule 27.10.2014    source источник


Ответы (2)


Вот один из способов, который может сработать (но лучше посмотрите ниже). Если у вас не включены vnodes, вы можете определить диапазоны токенов (из команды nodetool ring), а затем использовать их как часть команды удаления. Например:

delete from MyTable where 
    token(MyPK) >= Token1 and 
    token(MyPK) < Token2 and
    (your delete logic here)
;

Однако гораздо более простым и безопасным методом было бы просто позволить Cassandra выяснить, где находятся данные, и просто сделать это с любого узла:

delete from MyTable where 
    (your delete logic here)
;
person BrianC    schedule 28.10.2014

nodetool getendpoints сообщает вам, какой узел владеет ключом раздела: http://www.datastax.com/documentation/cassandra/2.1/cassandra/tools/toolsGetEndPoints.html?scroll=toolsGetEndPoints__toolsGetEndPtEx

person catpaws    schedule 27.10.2014
comment
nodetool было бы в порядке, если бы я удалял записи по отдельности, используя cqlsh, но я хочу написать клиентскую программу для ведения домашнего хозяйства. - person Raedwald; 27.10.2014