Попробуйте поместить свой оператор CREATE TABLE
в плоский файл (например, schema.cql), а затем выполнить cqlsh -f schema.cql
Кстати, 56 000 столбцов — это ОГРОМНО, и ни один здравомыслящий разработчик никогда не создаст таблицу с более чем 1 000 столбцов... Что вы пытаетесь проверить и подтвердить в этом сценарии?
---- Ответ на 1-й комментарий --
Схема полностью посвящена метаданным, потому что необработанные данные в любом случае записываются на диск как byte[]
. Чем больше у вас столбцов в таблице, тем больше метаданных будет в памяти.
Поэтому при извлечении я передам конкретное имя столбца в запросе выбора (с учетом производительности), чтобы он не извлекал все столбцы.
Это не так просто. Все столбцы размером 56 КБ хранятся на диске непрерывно. При чтении данных у Cassandra есть структуры индексов, позволяющие пропускать ключи секций и столбцы кластеризации. Для обычных столбцов, как и в вашем случае, нет индекса для получения точного столбца, запрошенного клиентом, поэтому, например, если вы делаете SELECT field1293 FROM usertable WHERE y_id = xxx
, Cassandra нужно будет сканировать весь блок от field1
до field56000
в памяти, прежде чем выбирать правый столбец, и это очень-очень ужасно неэффективно
--- Ответ на N-й комментарий --
Я согласен, что это станет очень медленным/неэффективным, но мне нужно реализовать этот сценарий для имитации данных генотипа.
Я рекомендую попробовать и протестировать эту схему:
create table usertable (
y_id varchar,
field_index int,
field_value varchard,
PRIMARY KEY(y_id, field_index)
);
//INSERT/UPDATE data into field N
INSERT INTO usertable(y_id, field_index, field_value)
VALUES('xxx', N, 'fieldN value');
//DELETE field N
DELETE FROM usertable WHERE y_id='xxx' AND field_index=N;
// Read EXACTLY field N
SELECT field_value FROM usertable WHERE y_id='xxx' AND field_index=N;
// Read field N to M, N <= M
SELECT field_value FROM usertable WHERE y_id='xxx'
AND field_index >=N
AND field_index <= M;
Вы увидите, что это работает намного лучше
person
doanduyhai
schedule
05.04.2016