【问题标题】:Insert data in map<text,text> in cassandra db在 cassandra db 中的 map<text,text> 中插入数据
【发布时间】:2016-08-24 04:39:15
【问题描述】:

我在 cassandra 数据库中有一个列 map&lt;text,text&gt;

我将这个表中的数据插入为:

INSERT INTO "Table1" (col1) VALUES ({'abc':'abc','hello':'world','flag':'true'});

所以,在我的代码中,我可以得到数据:

{
    "abc":"abc",
    "hello":"world",
    "flag":"true"
}

但是,现在我想要这样:

{
    "abc":"abc",
    "hello":"world",
    "flag":{
    "data":{ "hi":"cassandra"},
    "working":"no"
    }
}

为此,当我尝试插入查询时,它说它与map&lt;text,text&gt;的类型不匹配

我怎样才能做到这一点?

【问题讨论】:

    标签: cassandra cql


    【解决方案1】:

    这里的问题(在您的第二个示例中)是 col1 的类型是 map&lt;text,text&gt;flag 是复杂类型,不再与该定义匹配。解决此问题的一种方法是为每个属性创建单独的 TEXT 列,以及为 flag 及其包含的数据创建用户定义类型:

    > CREATE TYPE flagtype (data map<text,text>,working text);
    > CREATE TABLE table1 (abc text,
                         hello text,
                          flag frozen<flagtype>
                         PRIMARY KEY (abc));
    

    然后插入第二个示例中的 JSON 文本即可。

    > INSERT INTO table1 JSON '{"abc":"abc",
                              "hello":"world",
                               "flag":{"data":{"hi":"cassandra"},
                                          "working":"no"}}';
    
    > SELECT * FROM table1;
    
     abc | flag                                       | hello
    -----+--------------------------------------------+-------
     abc | {data: {'hi': 'cassandra'}, working: 'no'} | world
    
    (1 rows)
    

    如果您坚持使用 map&lt;text,text&gt; 类型,并且希望将值 JSON 子属性视为一个大的 text 字符串,您可以尝试这样一个简单的表:

    CREATE TABLE stackoverflow.table2 (
      key1 text PRIMARY KEY,
      col1 map<text, text>);
    

    在您的INSERTs 上,只需避开内部引号:

    > INSERT INTO table2 JSON '{"key1":"1","col1":{"abc":"abc","hello":"world"}}';
    > INSERT INTO table2 JSON '{"key1":"2","col1":{"abc":"abc","hello":"world",
                      "flag":"{\"data\":{\"hi\":\"cassandra\"},\"working\":\"no\"}"}}';
    
    > SELECT * FROm table2;
    
     key1 | col1
    ------+----------------------------------------------------------------------------------------
        2 | {'abc': 'abc', 'flag': '{"data":{"hi":"cassandra"},"working":"no"}', 'hello': 'world'}
        1 |                                                       {'abc': 'abc', 'hello': 'world'}
    
    (2 rows)
    

    这有点麻烦,可能需要在您的应用程序端进行一些额外的解析。但它可以解决必须定义每一列的问题。

    【讨论】:

    • 我想,我只会以文本的形式插入它,在我的代码中,我将从我传递的文本中生成 json。这不可能吗?
    • 而且,我有大量的属性(将来可以扩展),所以创建一个包含每个属性的表是不可行的。
    • 不幸的是,它不会仅仅塑造 JSON 以适应底层结构。而frozen 只意味着需要一次更新整个列,而不是它的单独属性(所以“不”它不会帮助你)。
    • 您告诉过这是解决此问题的一种方法。这很好,但问题是我有 100 个属性,如果未定义某些属性,它们将被定义为 null。您是否知道任何其他方式将其作为文本或其他方式输入?由于数据以 map 的形式包含,因此很难定义所有属性并重新构建表格
    • @demo99989 添加了另一个示例。也许这些方面的东西会帮助你。
    猜你喜欢
    • 2016-01-28
    • 2016-05-04
    • 1970-01-01
    • 2017-02-02
    • 2021-02-11
    • 2015-08-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多