用户定义类型可以引用 Cassandra 中的另一个用户定义类型吗?

Can a User Defined Type reference another user defined type in Cassandra?

在下面的代码示例中有一个 'address' 类型并且插入工作正常。但是,如果我向映射到 new_attribute 类型的地址类型 (new_attribute) 添加一个附加属性,然后插入 user_profiles 配置文件时出现与类型映射不兼容的错误。 Cassandra 的新手,所以我们将不胜感激。

CREATE TYPE new_attribute (
      name text,
      *map_l list<text>*
  );


CREATE TYPE address (
      street text,
      city text,
      zip int, 
      *new_attribute map<text, FROZEN<list<new_attribute>>>*
  );

  CREATE TABLE user_profiles (
      login text PRIMARY KEY,
      first_name text,
      last_name text,
      email text,
      addresses map<text, frozen<address>>
  );

  // Inserts a user with a home address
  INSERT INTO user_profiles(login, first_name, last_name, email, addresses)
  VALUES ('tsmith',
          'Tom',
          'Smith',
          'tsmith@gmail.com',
          { 'home': { street: '1021 West 4th St. #202',
                      city: 'San Fransisco',
                      zip: 94110 ,
                      *new_attribute: [{'name': 'some value',
                                        map_l: ['list', 'of',    'text']}]}});*

我不确定您的确切错误是什么,但这是受支持的(至少在最新版本的 Cassandra 中)。我认为您只是在该属性的 CQL 文字中有一个错误。所有这些嵌套集合都令人费解。这是一个工作文字:

INSERT INTO user_profiles(login, first_name, last_name, email, addresses)
  VALUES ('tsmith',
          'Tom',
          'Smith',
          'tsmith@gmail.com',
          {'home': {street: '1021 West 4th St. #202',
                    city: 'San Fransisco',
                    zip: 94110 ,
                    new_attribute: {'key': [{name: 'some value', 
                                             map_l: ['list', 'of', 'text']}]}}});

删除 name 周围的单引号:'some value'

这非常棘手,但 UDT 文字与使用 CQL 的地图文字略有不同:

地图文字:{'key1': 'value1', 'key2': 'value2'}

UDT 文字:{field1: 'value1', field2: 'value2'}