【问题标题】:What happens when adding a field in UDT in Cassandra?在 Cassandra 的 UDT 中添加字段时会发生什么?
【发布时间】:2020-05-06 19:53:29
【问题描述】:

例如,假设我有一个 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;

我想问一下,当你在 UDT 类型中添加一个新字段(它目前是表中的一列)时,Cassandra 会发生什么?这个问题的原因是我担心当表包含大量数据(数百万条记录)时会发生一些副作用。最好能说明从头到尾发生的事情。

【问题讨论】:

    标签: cassandra


    【解决方案1】:

    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}
    

    如果我使用 alter type test.udt add t2 int; 将字段添加到 UDT,我会立即看到 null 作为新 UDT 字段的值:

    cqlsh> select * from test.u2;
    
     id | u
    ----+--------------------------
      5 | {id: 1, t1: 3, t2: null}
    

    如果我在 SSTable 上执行sstabledump,我可以看到它只包含旧数据:

    [
      {
        "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 }
            ]
          }
        ]
      }
    ]
    

    另见my answer about adding/removing columns

    【讨论】:

      猜你喜欢
      • 2015-10-18
      • 2015-04-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-19
      • 2011-12-25
      • 2020-05-17
      • 1970-01-01
      相关资源
      最近更新 更多