【问题标题】:Is it possible to sort a Cassandra Column Family by a specific column of a list of a user-defined datatype?是否可以按用户定义数据类型列表的特定列对 Cassandra 列族进行排序?
【发布时间】:2019-03-10 06:39:36
【问题描述】:

我有点难以理解 Cassandra。我根本无法写出这个问题而不让它看起来很混乱,但是当我在下面详细说明它可能会变得更清楚。

假设我已经创建了这个数据类型:

CREATE TYPE transaction (
    transaction_id UUID,
    value float,
    transaction_date timestamp,
    PRIMARY KEY (transaction_id, transaction_date)
);

PS:我把它当作一个“类”来使用,但这可能是我的逻辑错误,如果不能这样使用,请纠正我。

无论如何,我也有这个列族,我在其中创建了这个“交易”数据类型的列表:

CREATE TABLE transactions_history_by_date (
    wallet_address UUID,
    user_id UUID,
    transactions list <transaction>,
    PRIMARY KEY (wallet_address, transaction_date))
WITH CLUSTERING ORDER BY (transaction_date DESC);

所以我想知道上面的这个列族是否正确。我想获取钱包的所有交易,按交易日期排序(但日期是“交易”数据类型的列 - 更复杂的是,在这个列族中有一个交易列表,并且不只是一个)。

【问题讨论】:

    标签: list sorting cassandra nosql cqlsh


    【解决方案1】:

    不,在 Cassandra 中,您只能对集群列的值进行排序 - 在这种情况下,您需要将 transaction_date 移动到表本身...

    【讨论】:

    • 谢谢亚历克斯!顺便说一句,如果我在主键中放置了多个簇键,则将根据我在WITH CLUSTERING ORDER BY (transaction_date DESC) 中指定的簇键进行排序,对吗?但是在这种情况下,我没有用于排序的簇列键有什么用?
    • 对所有聚类列进行排序,如果你有多个聚类列,数据首先在第一个排序,然后第一列具有相同值的数据在第二个排序,等等。参见这篇文章: datastax.com/dev/blog/we-shall-have-order
    【解决方案2】:

    为了扩展亚历克斯的答案,在您的情况下,我认为最好的方法可能是对您的表进行非规范化。您可以创建类似这样的东西,而不是使用 UDT:

    CREATE TABLE transactions_history_by_date (
    wallet_address UUID,
    user_id UUID,
    transaction_id UUID,
    value float,
    transaction_date timestamp,
    PRIMARY KEY ((wallet_address), transaction_date, transaction_id))
    WITH CLUSTERING ORDER BY (transaction_date DESC);
    

    现在您可以进行以下查询,结果将按日期排序:

    SELECT * FROM transactions_history_by_date WHERE wallet_address = ...;

    请注意,我添加了transaction_id 作为第二个集群键。如果省略了这一点,该表将无法保存两个具有相同 wallet_address 和相同 transaction_date 的交易。这是因为唯一行由主键标识。

    【讨论】:

    • 非常明确,谢谢贾斯汀!事实上,据我所知,Cassandra 的主要观点之一就是非规范化。请问,我可以再问你几个问题吗? 1-如果有多个集群键,我不用于排序的集群键的用途是什么?我的意思是,你说我无法在同一个 wallet_addresstransaction_date 中处理两笔交易……我不太确定为什么。
    • 另外,2- 我怎样才能将transaction_id 的列表链接到transaction_datevalue 的列表?我正在考虑使用 UDT 使这种链接成为可能,因为每个事务都会有特定的时间戳和值,但是如果我对列族进行非规范化并列出这些事务属性的列表,我不确定我会如何告诉 @ 987654330@等等……
    • 1 - 我更新了我的答案以澄清主键用于识别唯一行(就像 SQL 数据库一样)。 2- 如果您想通过transaction_id 查询,您需要使用不同的主键创建第二个表,并复制数据。类似:PRIMARY KEY ((transaction_id)) 可以工作,前提是 transaction_id 在您的应用程序中是全局唯一的。 Cassandra 也有物化视图,但是它们被认为是实验性的并且有一些警告,所以请谨慎使用 - read this first
    猜你喜欢
    • 1970-01-01
    • 2017-04-08
    • 1970-01-01
    • 2022-01-18
    • 1970-01-01
    • 1970-01-01
    • 2018-01-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多