我在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>
不匹配
我该如何做到这一点?
答案 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,可能需要在您的应用程序端进行一些额外的解析。但它解决了必须定义每个列的问题。