Spring Data Cassandra Insert создает надгробные плиты ячеек

Я использую Spring Boot 1.5.1.RELEASE с spring-boot-starter-data-cassandra.

Я столкнулся с проблемой, когда использую CassandraOperations.insert, и это вызывает кучу надгробий ячеек. По всей видимости, это вызвано: https://jira.spring.io/browse/DATACASS-182. Поскольку Spring Data теперь вставляет фактический null для нулевых значений, это вызывает захоронения ячеек. Я не нашел способа запретить Spring Data этого делать. Есть ли конфигурация или что-то, где я могу сказать «для этой вставки не вставляйте фактические нулевые значения»?


person cloudwalker    schedule 24.03.2017    source источник
comment
Это невозможно. Вы хотите подать заявку, чтобы мы обсудили, как ее улучшить?   -  person mp911de    schedule 24.03.2017
comment
Обязательно подам билет. Было бы неплохо, если бы вы могли включить что-то подобное в WriteOptions, чтобы это можно было сделать на уровне запроса.   -  person cloudwalker    schedule 24.03.2017
comment
AFAIU, записывающий ноль при вставке, создает нежелательные надгробные камни. С точки зрения запроса не должно иметь значения, где написано null или ячейка вообще не была записана. Есть ли случай, когда вы хотели бы создать надгробные плиты ячеек на вставке?   -  person mp911de    schedule 24.03.2017
comment
Мы тоже столкнулись с этой проблемой. Любая пустая вставка в Cassandra создает надгробие. У нас есть некоторые случаи, когда у нас есть ячейка с более чем 1000 надгробий, что вызывает проблемы с производительностью.   -  person gsteiner    schedule 24.03.2017
comment
@ mp911de Что ж, согласно jira.spring.io/browse/DATACASS-182, некоторые люди хотят создавать надгробия при записи в том случае, если они обнуляют значение в ячейке, которое было ранее установлено. Итак, я думаю, было бы полезно иметь возможность на уровне запроса указывать, хотите ли вы, чтобы записывались буквальные значения NULL. Таким образом, у вас не будет проблем с производительностью при вставках, где вам не нужны буквальные нули, но у вас все еще есть возможность делать обновления, когда вы можете перезаписать ранее установленное значение нулевым. Я займусь оформлением билета сегодня. Спасибо!   -  person cloudwalker    schedule 24.03.2017
comment
Вы знаете, каково поведение текущего выпуска Spring Data Cassandra (2.1.x). Мы сталкиваемся с огромным количеством надгробий и не знаем, откуда они взялись.   -  person Stefan Razvan Florea    schedule 10.12.2018


Ответы (2)


Одно из самых простых и ненавязчивых решений - использовать

CassandraTemplate.insert()/CassandraBatchOperations.insert()

Обычно надгробия создаются, когда сгенерированный CQL имеет явные нулевые значения. например, следующий запрос вставит одно надгробие.

Insert into KeyspaceName.TableName(ColumnName1, ColumnName2, ColumnName3)
values (Column1Value, Column2Value, null)

Cassandra рассматривает insert как upsert и для каждого нуля пытается удалить существующее значение столбца без выполнения проверки, существует ли значение столбца или нет. Таким образом, для каждого нулевого значения создается надгробие, что означает, что значение было удалено.

Однако следующий запрос не создаст надгробие.

Insert into KeyspaceName.TableName(ColumnName1, ColumnName2)
values (Column1Value, Column2Value)

Запрос, сгенерированный CassandraTemplate.insert()/CassandraBatchOperations.insert(), игнорирует столбцы с нулевыми значениями и генерирует CQL со столбцами с ненулевыми значениями. Следовательно, не создает надгробий.

person Pankaj    schedule 07.05.2019
comment
Правильно ли обрабатывает ли CassandraRepository.saveAll () нулевые значения? - person Fabien MIFSUD; 03.06.2020

В настоящее время это ограничение Spring Data Cassandra. Я создал https://jira.spring.io/browse/DATACASS-420 отслеживать это. Чтобы временно обойти это, я создал собственный класс, расширяющий MappingCassandraConverter, и переписал метод writeInsertFromWrapper, чтобы не вставлять нули.

person cloudwalker    schedule 24.03.2017