2016-07-13 2 views
3

Я вставляю ~ 8 рядов в секунду, и я хотел бы иметь одну большую таблицу со всеми строками, и я хочу разбить эту таблицу на многие таблицы каждую неделю. Может ли перегородки таблицы Кассандры?

например
select * from keyspace.rootTable; -> returns all rows from all tables 
select * from keyspace.27-2016Table -> return all rows from week 27 
+0

Только если неделя - это первая часть ключа. – OrangeDog

+0

, вероятно, лучше иметь одну таблицу и включить неделю в раздел. –

ответ

3

В 86400 секунд в день и 604800 секунд в неделю, вы будете хранить 691200 строк в день и 4838400 строк каждую неделю. Даже не зная, насколько широки ваши ряды, слишком много для возврата в одном запросе. Cassandra отлично подходит для хранения большого количества данных, подобных этому. Но запрашивать много таких данных ... не так много.

Возможно, вам захочется разделить на час, но даже это даст вам 28800 строк. Это, по крайней мере, полу-управляемо, так что давайте покончим с этим.

Я бы построить таблицу, которая выглядит следующим образом, разбиение на week и hourBucket в то время как кластеризация на writeTime:

CREATE TABLE youAreAskingCassandraForTooManyRows (
    week text, 
    hourBucket text, 
    writeTime timestamp, 
    value text, 
    PRIMARY KEY ((week,hourBucket),writeTime)) 
WITH CLUSTERING ORDER BY (writeTime DESC); 

Тогда я мог бы запросить по конкретной недели и час, только с помощью клавиш разделов:

[email protected]:stackoverflow> SELECT * 
    FROM youareaskingcassandrafortoomanyrows 
    WHERE week='201607-3' AND hourBucket ='20160713-14'; 

week  | hourBucket | writetime    | value 
----------+--------------+--------------------------+-------- 
201607-3 | 20160713-14 | 2016-07-13 14:01:18+0000 | value6 
201607-3 | 20160713-14 | 2016-07-13 14:01:14+0000 | value5 
201607-3 | 20160713-14 | 2016-07-13 14:01:12+0000 | value4 
201607-3 | 20160713-14 | 2016-07-13 14:01:10+0000 | value3 
201607-3 | 20160713-14 | 2016-07-13 14:01:07+0000 | value2 
201607-3 | 20160713-14 | 2016-07-13 14:01:04+0000 | value1 

(6 rows) 

Или даже для определенного диапазона, на основе ключа кластеризации writetime.

[email protected]:stackoverflow> SELECT * 
    FROM youareaskingcassandrafortoomanyrows 
    WHERE week='201607-3' AND hourBucket ='20160713-14' 
    AND writetime > '2016-07-13 14:01:05+0000' 
    AND writetime < '2016-07-13 14:01:18+0000'; 

week  | hourBucket | writetime    | value 
----------+--------------+--------------------------+-------- 
201607-3 | 20160713-14 | 2016-07-13 14:01:14+0000 | value5 
201607-3 | 20160713-14 | 2016-07-13 14:01:12+0000 | value4 
201607-3 | 20160713-14 | 2016-07-13 14:01:10+0000 | value3 
201607-3 | 20160713-14 | 2016-07-13 14:01:07+0000 | value2 

(4 rows) 
select * from keyspace.rootTable; -> returns all rows from all tables 

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

Важно отметить, что Cassandra не является реляционной базой данных. Это распределенная система, и, таким образом, запуск несвязанных запросов (запросов без предложения WHERE) вводит в ваше уравнение количество времени сети. Вот почему вы всегда хотите указать как минимум ключ раздела (ов) со всеми запросами SELECT, потому что тогда вы можете гарантировать, что вы будете удовлетворять этому запросу с одного узла.

Вы должны взглянуть на статью Патрика Макфадина по телефону Getting Started with Time Series Data Modeling. Это должно помочь вам понять, как разделять данные, подобные этому, и вы попадаете на правильный путь.

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