Что происходит при добавлении поля в UDT в Cassandra? - PullRequest
1 голос
/ 06 мая 2020

Например, предположим, что у меня есть тип basic_info:

CREATE TYPE basic_info (first_name text, last_name text, nationality text)

И такая таблица:

CREATE TABLE student_stats  (id int PRIMARY KEY, grade text, basics FROZEN<basic_info>)

И у меня есть миллионы записей в таблице.

Если я добавлю поле в basic_info вроде этого:

ALTER TYPE basic_info ADD address text;

Я хочу спросить, что происходит в Cassandra, когда вы добавляете новое поле в тип UDT (в настоящее время это столбец в таблице)? Причина этого вопроса в том, что я боюсь, что могут возникнуть побочные эффекты, если таблица будет содержать много данных (миллионы записей). Лучше всего, если вы сможете объяснить то, что произойдет от начала до конца.

1 Ответ

1 голос
/ 06 мая 2020

поля 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 }
        ]
      }
    ]
  }
]

См. также мой ответ о добавлении / удалении столбцов

...