gpt4 book ai didi

apache-spark - 使用 "contains"查询用户定义类型 (UDT) 列表

转载 作者:行者123 更新时间:2023-12-01 00:54:27 27 4
gpt4 key购买 nike

对于数据模型,如:

create type city (
name text,
code int
);

create table user (
id uuid,
name text,
cities list<FROZEN<city>>,
primary key ( id )
);

create index user_city_index on user(cities);

查询为
select id, cities from user where cities contains {name:'My City', code: 10};

工作正常。但是可以查询吗
select id, cities from user where cities contains {name:'My City'};

并丢弃 code属性,即 code=<any> ?

这可以通过使用 Spark 来实现吗?

最佳答案

But is it possible to query: select id, cities from user where cities contains {name:'My City'};



不它不是。 using a UDT 上的文档状态(对于 UDT 列 name ):

  1. Filter data on a column of a user-defined type. Create an index and then run a conditional query. In Cassandra 2.1.x, you need to list all components of the name column in the WHERE clause.


所以查询你的 cities UDT 集合将需要 city 的所有组件类型。

我确定有一种方法可以在 Spark 中查询,但我会给你一个基于 Cassandra 的答案。基本上,创建一个已定义/索引的附加列表列以保存城市名称列表,然后运行您的 CONTAINS在那。更好的是,将 city 非规范化输入一个查询表( usersbycity ),并带有一个 PRIMARY KEY 定义,如 PRIMARY KEY(cityname, citycode, userid)并在您的 user 之外使用它表支持按城市名称和代码(或仅城市名称)查询。

请记住,当表专门设计为适合您的查询模式时,Cassandra 效果最佳。二级索引是为了方便,而不是为了性能。尝试增加一个表以支持多个查询是一种 RDBM 数据建模方法(通常在 Cassandra 中效果不佳)。而不是一张表很好地服务于一个查询,你通常最终会得到一张服务于多个查询的表。

编辑您的问题:

1)“可以接受长集群键吗?”

我目前找不到关于此的明确声明,但我认为这里更大的问题在于如何在“幕后”存储/使用集群键。本质上,每个聚类键值都附加到每个列值(以便更快地检索)。显然,如果你有很多磁盘空间,那会占用磁盘空间(现在不是什么大问题……如果是的话,你可以用 COMPACT STORAGE 指令来解决这个问题)。

如果你有很多,它最终可能会影响性能。我可以仔细检查一下这个,然后给你回复。我不会...说... 100个集群键。但我认为 10 不是什么大问题。我知道我已经使用 7 或 8 创建了模型,并且它们的性能很好。

2)“如果还有其他与用户相关的非规范化表(如 usersbyhobby、usersbybookread 等),由于 c* 中没有 JOIN,我如何将这些表的过滤与来自 usersbycity 的过滤结合到一个查询中?”

您不能在查询时组合它们。您可以做的是,如果您发现有一个查询需要同时来自 usersbyhobby、usersbybookread 和 usersbycity 的数据;是创建一个包含所有这些数据的非规范化表。根据您的查询需要,您可能需要以不同的方式对 PRIMARY KEY 进行排序,在这种情况下,您需要创建与要服务的特定查询一样多的表。

另一种选择是进行单独的查询并在客户端管理它们。客户端 JOIN 被认为是 Cassandra 反模式,所以我会谨慎使用它。这完全取决于您的应用程序的需求,以及您是否希望将大部分时间用于数据建模/管理或客户端处理。老实说,我更喜欢让客户端尽可能简单。

关于apache-spark - 使用 "contains"查询用户定义类型 (UDT) 列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29012661/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com