Как избежать надгробий кассандры при вставке значений NULL - PullRequest
0 голосов
/ 27 декабря 2018

Моя проблема в том, что cassandra создает надгробия при вставке значений NULL.

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

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

Я бы хотел, чтобы cassandra использовала ту же технику для вставки NULL, что и для любого другого значения - используйте метку времени и во время сжатия сохраняйте последнюю запись - даже еслизапись имеет значение NULL (или мы можем назвать это "unset").Есть ли какие-либо изменения в конфигурации cassandra или какой-либо подход, как я мог бы добиться upserts с нулями, не имея надгробий?

Я сталкивался эта проблема однако он позволяет игнорировать только значения NULL

Мой сценарий использования : у меня есть поток событий, каждое событие идентифицировано по причине.Я получаю много событий с одним и тем же причиной, и я хочу сохранить только последнее событие для одного и того же причины (используя upsert).Свойства события могут изменяться с NULL на конкретное значение, но также и с конкретного значения на NULL.К сожалению, в последнем случае генерируются надгробия и ухудшается производительность чтения.

Обновление

Кажется, я никак не могу избежать надгробий.Не могли бы вы посоветовать мне методы, как минимизировать их (установите для gc_grace_seconds очень низкое значение).Каковы риски, что делать, когда узел выходит из строя на более длительный период, чем gc_grace_seconds?

Ответы [ 2 ]

0 голосов
/ 27 декабря 2018

Вы не можете вставить NULL в Cassandra - это имеет особое значение и ведет к созданию надгробий, которые вы наблюдаете.Если вы хотите трактовать NULL как особое значение, почему бы не решить эту проблему на стороне приложения - когда вы получаете статус null, просто вставьте любое специальное значение, которое нельзя использовать в вашей таблице, и когда вы читаете данные обратно,проверьте это специальное значение и выведите null в запросчик ...

0 голосов
/ 27 декабря 2018

Вы не можете избежать надгробий, если вы особо упомянули NULL в вашей INSERT.C * не выполняет поиск перед вставкой или записью данных, что делает запись очень быстрой.Для этого C * просто вставляет надгробную плиту, чтобы избежать этого значения позже (с последним обновлением, сравнивающим временную метку).Если вы хотите избежать надгробия (что рекомендуется), вы должны подготовить различные комбинации запросов, чтобы проверить каждый из них на NULL, прежде чем добавлять его в INSERT.Если у вас очень мало полей для проверки, вам будет просто добавить несколько операторов IF-ELSE.Но если их будет много, код будет больше и менее читабельным.Вкратце, вы не можете вставить NULL, что позже повлияет на производительность чтения.

Вставка нулевых значений в cassandra

...