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

时间:2016-05-06 15:52:03

标签: cassandra datastax cassandra-2.0

在下面的代码示例中,有一个'地址'类型和插入工作正常。但是,如果我向映射到 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']}]}});*

2 个答案:

答案 0 :(得分:1)

我不确定你的确切错误是什么,但这是支持的(至少在更新的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']}]}}});

答案 1 :(得分:1)

删除围绕名称的简单引号:&#39;某些值&#39;

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

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

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