2015-01-14 3 views
1

У меня есть таблица, как показано ниже.Только сканирование диапазона дат Cassandra CQL timestamp

CREATE TEST(
HOURLYTIME TIMESTAMP, 
FULLTIME TIMESTAMP, 
DATA TEXT, 
PRIMARY KEY(HOURLYTIME,FULLTIME) 
) 

Я вставил запись (2014-12-12 00:00:00,2014-12-12 00:00:01,'Hello World')

Я хотел бы поиск, основанный на временной диапазон даты в поле HOURLYTIME который держит почасовой records.When я пытался с маркером() как

select * from TEST where token(HOURLYTIME)=token('2014-12-12')

, чтобы получить все записи на эту дату, они возвращаются только за один час, то есть для

2014-12-12 **00:00:00** 

Если я добавить диапазон дат

select * from TEST where token(HOURLYTIME)>=token('2014-12-12') AND token(HOURLYTIME)<=token('2014-12-14'); 

Это дает ошибку: Более одно ограничение было установлено для начала связанного.

Как решить эту проблему.

Я могу сканировать с помощью FULLTIME, но мне нужно предоставить ALLOW FILTERING, который будет сканировать целые записи & неэффективно.

+0

вы можете попробовать> 2014-12-12 00:00:00 & <2014-12-12 23:59:59 ... –

ответ

3

Вы не можете ограничить первичный ключ диапазоном, не требуя явного запроса с возможностью фильтрации. Это предотвращает запросы, требующие полного сканирования таблицы, которое, как вы заметили, медленное и не будет масштабироваться для истинных больших размеров данных. Причина этого в том, что значения первичного ключа беспорядочно хэшируются, поэтому определение диапазона значений первичного ключа в основном такое же, как предоставление двух случайно связанных случайных чисел. Например, в вашем случае даты, скорее всего, не монотонно хешируются. Это означает, что вы хотите, чтобы даты хеша были меньше значения, которое хэш другого значения вернет полностью случайный набор данных.

Проблема в том, что ваша настройка таблицы не позволяет выполнять запросы, которые вы действительно хотите выполнить. Вам нужно смоделировать таблицы, чтобы информация, которую вы хотите, могла быть получена из одного раздела.

0

Запрос диапазона дат работает нормально. Я использую следующие версии:

[cqlsh 4.1.0 | Cassandra 2.0.4 | CQL spec 3.1.1 | Thrift protocol 19.39.0] 

Возможно, возникла проблема с более старыми версиями. Пожалуйста, проверьте.

4

Чтобы задать запрос диапазона, необходимо, чтобы этот столбец был кластеризованным.

В этом случае это будет эффективно, поскольку столбцы кластеризации будут отсортированы. Если вы хотите искать данные, вам нужно указать ключ раздела.

Так как пример, где я использую device_id в качестве ключа секционирования:

CREATE TABLE IF NOT EXISTS mykeyspace.device_data (
DEVICE_ID text, 
HOURLYTIME TIMESTAMP, 
FULLTIME TIMESTAMP, 
DATA TEXT, 
PRIMARY KEY (DEVICE_ID, HOURLYTIME, FULLTIME) 
); 

INSERT INTO mykeyspace.device_data (device_id, hourlytime, fulltime, data) 
values('Spam machine', '2014-12-12 00:01:00','2014-12-12 00:00:01','Hello World1'); 

INSERT INTO mykeyspace.device_data (device_id, hourlytime, fulltime, data) 
values('Spam machine', '2014-12-12 00:02:00','2014-12-12 00:00:02','Hello World2'); 

INSERT INTO mykeyspace.device_data (device_id, hourlytime, fulltime, data) 
values('Spam machine', '2014-12-12 00:03:00','2014-12-12 00:00:03','Hello World3'); 

-- Effective range query 
SELECT * FROM mykeyspace.device_data 
WHERE device_id = 'Spam machine' 
    AND hourlytime > '2014-12-12 00:00:00' 
    AND hourlytime < '2014-12-12 00:02:00'; 

Или другой пример, где я раздел данных в день (что вызовет разброс данных по всей группе славно), и выполнять интервальные запросы :

CREATE TABLE IF NOT EXISTS mykeyspace.day_data (
    DAYTIME timestamp, 
    HOURLYTIME TIMESTAMP, 
    FULLTIME TIMESTAMP, 
    DATA TEXT, 
    PRIMARY KEY (DAYTIME, HOURLYTIME, FULLTIME) 
); 

INSERT INTO mykeyspace.day_data (DAYTIME, hourlytime, fulltime, data) 
values('2014-12-12', '2014-12-12 00:01:00','2014-12-12 00:00:01','Hello World1'); 

INSERT INTO mykeyspace.day_data (DAYTIME, hourlytime, fulltime, data) 
values('2014-12-12', '2014-12-12 00:02:00','2014-12-12 00:00:02','Hello World2'); 

INSERT INTO mykeyspace.day_data (DAYTIME, hourlytime, fulltime, data) 
values('2014-12-12', '2014-12-12 00:03:00','2014-12-12 00:00:03','Hello World3'); 

SELECT * FROM mykeyspace.day_data 
WHERE daytime = '2014-12-12' 
    AND hourlytime > '2014-12-12 00:00:00' 
    AND hourlytime < '2014-12-12 00:02:00'; 

Существует очень полезная статья о данных таймсерий на PlanetCassandra

Смежные вопросы