在cassandra db中的地图<text,text>中插入数据

时间:2016-08-23 15:41:22

标签: cassandra cql

我在cassandra数据库中有一列map<text,text>

我将数据插入此表中:

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<text,text>不匹配

我该如何做到这一点?

1 个答案:

答案 0 :(得分:1)

此处(在您的第二个示例中)的问题是col1的类型是map<text,text>,但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<text,text>类型,并希望将值JSON子属性视为一个大的text字符串,你可以尝试这样一个简单的表:

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

在你的INSERT上,只是逃避内在的引号:

> 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)

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