【问题标题】:Cassandra map collection support in thriftthrift 中的 Cassandra 地图收集支持
【发布时间】:2019-01-03 21:25:32
【问题描述】:

是否可以在 CQL3 中定义地图集合,然后在 Thrift 中作为列组读取?

基于https://www.datastax.com/dev/blog/thrift-to-cql3 混合静态和动态列时,动态列在 CQL3 中不可见。推荐的方法是使用集合。但是,在非紧凑存储表中定义集合时,它在 Thrift 中根本不可见。当将其定义为冻结和紧凑存储时,它显示为单列。

create table main.exp2 (
    article_id blob primary key,
    text text,
    scantime int,
    info text,
    rest frozen<map<text, blob>>) WITH COMPACT STORAGE;

我是否错过了一些可能未记录的选项?我的库版本是否太旧?

或者,在哪里可以要求将此作为新功能?显然,随着 thrift 被弃用,我不能指望存储本身有任何变化,但是根据 thrift-to-cql3 页面上的解释,我希望有一些方法可以通过复合列名来提供数据到 thrift。

Motivation 是一种前向兼容性 - 准备表,以便当前具有 thrift 的应用程序可以使用它,也可以由 CQL3 的新应用程序使用。目前看来,这种组合只有在完全动态的表中才有可能。

虽然如https://docs.datastax.com/en/cql/3.3/cql/cql_reference/refLimits.html 中提到的,map 集合中的值长度有 64KB 的限制,但我们无论如何都不能使用它。

所以也许要求从 CQL3 读取混合表的动态列的功能更有意义......

编辑:请注意,我知道我可以在没有任何静态列的情况下定义表,如下所示:

create table main.exp1 (
    article_id blob,
    column_key text,
    value blob,
    PRIMARY KEY (article_id, column_key)
) WITH COMPACT STORAGE AND CLUSTERING ORDER BY (column_key ASC);

但这意味着我所有的价值观都是一团糟,包括我事先知道的那些。

【问题讨论】:

    标签: cassandra cql thrift cassandra-3.0 cql3


    【解决方案1】:

    我只需通过添加一个新的聚类列来区分值,将地图展开成单独的行。对于您的设计,您还可以将公共部分移动到静态列中,因此它们将始终被返回。表结构可能如下所示:

    create table main.exp2 (
        article_id blob,
        text text static,
        scantime int static,
        info text static,
        rest_key text,
        rest_value blob,
        primary key (article_id, rest_key)
        );
    

    附: Thrift 将在下一个版本中消失,因此最好将所有内容都转换为 CQL

    【讨论】:

    • 如果没有紧凑型存储,它将无法与 Thrift 一起使用。是的,我知道 Cassandra 计划抛弃那些让他们的产品变得很棒的东西。 :)
    猜你喜欢
    • 2014-08-26
    • 2023-04-09
    • 2013-07-06
    • 2013-10-19
    • 2020-04-27
    • 1970-01-01
    • 1970-01-01
    • 2013-01-12
    • 2018-01-19
    相关资源
    最近更新 更多