当前位置: 首页 > 知识库问答 >
问题:

如何按用户定义类型中的字段过滤卡桑德拉查询

司寇昱
2023-03-14

如何根据用户定义的类型字段筛选cassandra查询?我想在我的cassandra数据库中创建人员表,所以我在我的cassandra中创建了这个用户定义的类型。

    create type fullname ( firstname text, lastname text );

我也有这张桌子。

    create table people ( id UUID primary key, name frozen <fullname> );

我需要过滤我的查询,以了解所有姓氏jolie的人。我如何从这个表中查询这个。在cassandra中过滤和查询的情况如何?我知道我可以删除全名类型并将名字和姓氏添加到主表中,但这是我想要做的一个示例。我必须有全名类型。

共有1个答案

陈霄
2023-03-14

简而言之:您可以使用二级索引通过全名UDT进行查询。但是您不能仅通过UDT的一部分进行查询。

// create table, type and index
create type fullname ( firstname text, lastname text );
create table people ( id UUID primary key, name frozen <fullname> );
create index fname_index on your_keyspace.people (name);

// insert some data into it
insert into people (id, name) values (now(), {firstname: 'foo', lastname: 'bar'});
insert into people (id, name) values (now(), {firstname: 'baz', lastname: 'qux'});

// query it by fullname
select * from people where name = { firstname: 'baz', lastname: 'qux' };

// the following will NOT work:
select * from people where name = { firstname: 'baz'};

这种行为的原因是实现C*二级索引的方式。一般来说,它只是C*维护的另一个隐藏表,在您的情况下定义为:

create table fname_index (name frozen <fullname> primary key, id uuid);

实际上,您的主键和主键在此表中进行了交换。因此,您的案例被简化为一个更一般的问题“为什么我不能仅通过部分PK进行查询?”:

    < li >对整个PK值(firstname lastname)进行哈希运算,得到的数字定义存储您的行的分区。 < li >对于该分区,您的行被追加到memtable(稍后在磁盘上刷新到SSTable,一个按键排序的文件) < li >当您只想按PK的一部分进行查询时(比如只按firstname),C*无法猜测要查找的分区(因为lastname未知,所以它无法计算整个fullname的hashcode),因为您的匹配可以在任何需要全表扫描的分区中的任何位置。C*明确禁止这些扫描,所以您别无选择:)

建议的解决方案:

  • 将UDT拆分为firstname和lastname等基本部分,并在其上创建二级索引
  • 将Cassandra 3.0与物化视图功能结合使用(实际上强制Cassandra为UDT的一部分维护自定义索引)
  • 重新访问您的数据模型,使其不那么严格(当没有人强迫您在没有帮助的地方使用UDT时)
 类似资料:
  • 我用Spring Data Cassandra 2.2.1开发了一个新的应用程序,想在Cassandra 2.1.9服务器上运行它(旧的,我知道)。但是我们得到了错误 Spring数据卡桑德拉手册声称Spring数据2.2.1至少需要卡桑德拉2.1,所以这应该有效,但它没有。我们包含的唯一特定于卡桑德拉的依赖项是 我怎样才能让这个工作?

  • 我正试图用Python插入到这个Cassandra表中 有了这份准备好的声明: 使用这段代码(数据库已打开并插入到其他表,因此连接有效): 我捕获了异常:“为 bind() 提供的参数太多(得到 12 个,预期为 4)”。 绑定函数是如何将我的4个参数转换为12个的? 希望有什么办法来解决这个问题? 或者,一些使用卡桑德拉MAP,LIST和SET的工作示例,从Python驱动程序将不胜感激。

  • 在你否决之前,我想声明,我看了所有类似的问题,但我仍然得到可怕的“主键列不能被限制”错误。 下面是我的表结构: 谢谢,德尼兹

  • 我有几个客户,每个客户都由一个“租户”代表 我想知道将这个概念建模的最佳方法是什么,我做了大量的研究,发现了这个课题:http://cassandra-user-incubator-apache-org.3065146.n2.nabble.com/Modeling-multi-tenanted-Cassandra-schema-td7591311.html 我知道有几种可能性 租户提供一个密钥空间

  • 卡桑德拉如何在内部存储空值?它是否占用任何存储空间?我正在编写一个应用程序,该应用程序使用具有许多列(100s)的表来表示不同类型的数据,因此列具有诸如“text1”,“text2”,“number1”,“number2”等名称,然后有一个外部JSON架构映射哪个列表示特定数据类型的什么值。因此,对于某种数据类型,许多列可能具有空值,并且我无法找到有关空值将占用的存储空间(如果有)的任何具体信息。

  • 我使用的是spring数据cassandra,需要使用jpa映射一个字段,在cassandra中,该字段的类型为