поля UDT описаны в таблице system_schema.types
. Когда вы добавляете новое поле, запись для этого типа обновляется внутри Cassandra, но никаких изменений данных на диске не произойдет (SSTables неизменяемы). Вместо этого, когда Cassandra считывает данные, она проверяет, присутствует ли поле или нет, а если нет (потому что оно не было установлено, или это новое поле UDT), то оно вернет null
для этого значения, но не изменит данные на диске.
Например, если у меня есть следующий тип и таблица, которая его использует:
CREATE TYPE test.udt (
id int,
t1 int
);
CREATE TABLE test.u2 (
id int PRIMARY KEY,
u udt
)
И у меня есть некоторые данные в таблице, поэтому я получаю:
cqlsh> select * from test.u2; id | u ----+---------------- 5 | {id: 1, t1: 3}
Если я добавляю поле в UDT с помощью alter type test.udt add t2 int;
, я сразу вижу null
как значение для нового поля UDT:
cqlsh> select * from test.u2;
id | u
----+--------------------------
5 | {id: 1, t1: 3, t2: null}
И если я добавляю sstabledump
на SSTable, я вижу, что он содержит только старые данные:
[
{
"partition" : {
"key" : [ "5" ],
"position" : 0
},
"rows" : [
{
"type" : "row",
"position" : 46,
"liveness_info" : { "tstamp" : "2019-07-28T09:33:12.019Z" },
"cells" : [
{ "name" : "u", "path" : [ "id" ], "value" : 1 },
{ "name" : "u", "path" : [ "t1" ], "value" : 3 }
]
}
]
}
]
См. также мой ответ о добавлении / удалении столбцов