【问题标题】:How to Create nested collection map<text,list<text>> type in cassandra database 2.2.1如何在 cassandra 数据库 2.2.1 中创建嵌套集合 map<text,list<text>> 类型
【发布时间】:2016-05-04 08:16:53
【问题描述】:
create table tbl_master_values (
  dbid int primary key,
  user_dbid int, reg_dbid int,
  module_dbid int,
  fields_value map<text,list<text>>,
  created_date timestamp,
  modified_date timestamp);

它返回此错误:

InvalidRequest: code=2200 [Invalid query] 
message="Non-frozen collections are not allowed inside collections: map<text, list<text>>"

【问题讨论】:

  • 你的脚本中有一个类型:fields_value map>
  • @doanduyhai 我也看到了。结果证明他的语法是正确的,但是 StackOverflow 编辑器错误地解释了他的尖括号。

标签: dictionary collections cassandra nested cql3


【解决方案1】:

在 Cassandra 中,如果您打算通过 in-Cassandra 查询添加或删除条目,则可以使用非冻结集合。但是当您打算在地图中使用 UDT 或嵌套集合时,您必须将前者声明为已冻结。 例如在你的情况下:

    create table tbl_master_values (
    dbid int primary key,
    user_dbid int, reg_dbid int,
    module_dbid int,
    fields_value map<text,frozen<list<text>>>,
    created_date timestamp,
    modified_date timestamp);

如果您使用 Map 来存储和检索信息,而不是更新行,您可以将其声明为:

    frozen<map<text, list<text>>>

记住 freeze 关键字不会让您更新该实体并将其存储为 blob 类型。 阅读此处以了解更新:

https://docs.datastax.com/en/cql/3.3/cql/cql_using/useInsertMap.html

【讨论】:

  • 如何从地图中查询列表并检查它是否包含值?
【解决方案2】:

集合内不允许非冻结集合:map>

Cassandra 告诉你,如果不使用 frozen 关键字,它就无法完成操作。

fields_value frozen<map<text, list<text>>>,

请记住,frozen 告诉 Cassandra 将值视为 blob,并防止修改值的各个部分。当您对冻结集合进行更改时,您将序列化和重写所有存储的项目。因此,对于经常更改的集合,这可能不是一个好的解决方案。

【讨论】:

  • 可以,但是无法搜索列表的值。也不能在上面创建索引。
猜你喜欢
  • 1970-01-01
  • 2016-01-28
  • 1970-01-01
  • 2021-02-11
  • 2013-12-30
  • 2021-06-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多