gpt4 book ai didi

Cassandra - 如何使用 cqlsh 创建复合列名(非键)

转载 作者:行者123 更新时间:2023-12-04 18:13:07 25 4
gpt4 key购买 nike

我正在尝试在 Cassandra 1.1 中对列族进行建模,逻辑上看起来像这样:

Entp: //CF
//rowkey-> entp_name_xyz:
{entp_full_name: "full_name_xyz",
some_value: 1,
policy: {policy_name: "default policy",
type: "type 1",
prop_1: "prop 1",
...
},
rules: {rule_1:, rule_2:,rule_3:}
}

我要建模的查询是:
获取给定 entp 名称的所有策略,获取给定 entp 的所有规则,获取给定 entp_name 的所有列
我打算将此列族建模为具有“宽行”,其中一行看起来像这样:
RowKey:- entp_name_xyz,
column_name:- policy:p1
Value:-{JSON object - {policy_name: "default policy", type: "type 1", prop_1: "prop 1", ...}}
column_name:- policy:p2
Value:-{JSON object - {policy_name: "default policy2", type: "type 1", prop_1: "prop 1", ...}}
column_name: rule:r1 where r1 is a rowkey of a Rules column family
Value: Null

现在我的问题是在 cqlsh 或 cassandra-cli 中,
  • 如何插入复合列名称,例如 policy:p1?
  • 使用此方案,是否可以进行如下查询:
    select * from entp where column_name like "policy:*"and entp_name= xyz 为了只读取所有策略列?
  • 如何为列设置空值。我在一些论坛上读到,您不需要设置 null,因为它相当于没有值。但是考虑一下这种情况
    你有一个带有 col1、col2 和 col3 的静态模式,我想插入一行 col3 =null,但 col1 和 col2 有一些值。插入此类数据的 cqlsh 语法是什么(我在文档中找不到),因为以下给出了错误:

    插入 entp (col1,col2,col3) 值 ("abc","xyz", null)

  • 谢谢!

    最佳答案

  • 复合 Material 在 CQL3 中更容易使用,在 cassandra 1.1 中可供您使用,所以我将在我的回答中使用它。 CQL3 中具有多组件主键的表相当于存储引擎(Cassandra)层中的宽行。

    如果我已经解释了您的政策和规则数据的样子,那么这是一个可能的答案:

    CREATE TABLE entp_policies (
    entp_name text,
    policy_name text,
    policy_value text,
    PRIMARY KEY (entp_name, policy_name)
    );
    CREATE TABLE entp_rules (
    entp_name text,
    rule_name text,
    rule_value text,
    PRIMARY KEY (entp_name, rule_name)
    );

    你会这样使用它:

    INSERT INTO entp_policies (entp_name, policy_name, policy_value)
    VALUES ('entp_name_xyz', 'p1',
    '{policy_name: "default policy", type: "type 1", ...}');

    INSERT INTO entp_policies (entp_name, policy_name, policy_value)
    VALUES ('entp_name_xyz', 'p2',
    '{policy_name: "default policy2", type: "type 1", ...}');

    INSERT INTO entp_rules (entp_name, rule_name) VALUES ('entp_name_xyz', 'r1');

    -- Get all policies given an entp name
    SELECT * FROM entp_policies WHERE entp_name = 'entp_name_xyz';

    -- Get all rules given an entp
    SELECT * FROM entp_rules WHERE entp_name = 'entp_name_xyz';

    -- Get all columns given an entp_name (both of the above)
  • 使用您的方案,是的,可以进行这样的查询,但它会比我的版本更挑剔,而且 CQL2 已被弃用。
  • 没错,您只是避免插入该值。没有任何明确的 NULL在 cql ( yet ) 中,但你可以这样做:

    insert into entp (col1,col2) values ('abc','xyz');

  • 希望有帮助!

    关于Cassandra - 如何使用 cqlsh 创建复合列名(非键),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12223925/

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