2016-04-04 2 views
0

Мне нужна таблица на Cassandra2 с 56K столбцами по 1 байт для целей тестирования.Создать таблицу со многими столбцами Cassandra 2

Я пытаюсь создать «usertable» с этим требованием, как это:

create table usertable (
    y_id varchar primary key, 
    field0 varchar, 
    field1 varchar, 
    field2 varchar, 
    ... 
    ... 
    field55999 varchar, 
    field56000 varchar); 

Когда я пытаюсь выполнить это из файла с помощью CQLSH, он работает навсегда без ответа и выделения большого объема памяти ,

Есть ли лучший способ достичь этого?

ответ

2

Попробуйте поставить ваше CREATE TABLE заявление в плоский файл (schema.cql, например), а затем выполнить cqlsh -f schema.cql

По они путь, 56k колонны является ОГРОМНЫЙ и ни один здравомыслящий разработчик никогда не создать таблица с столбцами более 1 тыс. ... Что вы пытаетесь проверить и утверждать с помощью этого сценария?

---- Ответ на комментарий 1 -

Schema все о метаданных, так как исходные данные записываются в виде byte[] на диске в любом случае. Чем больше у вас столбцов в таблице, тем больше метаданных будет в памяти.

Так при получении, я передам конкретное имя столбца в запросе на выборку (сохраняя производительность в виду), так что он не будет получать все столбцы

Это не так просто. Все столбцы 56k хранятся на диске смежно. При чтении данных 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; 

Вы увидите, что он работает лучше wayyyyyyy

+0

Какие штрафные санкции, если я сделаю так? Поскольку cassandra поддерживает 2 миллиарда ячеек на раздел. Поэтому при извлечении я передам имя конкретного столбца в выбранном запросе (сохраняя при этом производительность), чтобы он не извлекал все столбцы. Так какими будут последствия или симптомы для этого типа уродливой схемы или, другими словами, какие воздействие на слишком широкий ряд? –

+1

См. Ответ выше – doanduyhai

+0

Итак, рассмотрим запрос 'SELECT field56000 FROM usertable WHERE y_id = xxx'. Если я попытаюсь выполнить вышеупомянутый запрос, тогда в память будет загружен столбец 56000, а затем он будет выполнять последовательное сканирование, пока не достигнет имени столбца field56000. Это то, что вы в точности имеете в виду? Поправьте меня, если я ошибаюсь. –

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