在 cassandra db 的 map<text,text> 中插入数据
Insert data in map<text,text> in cassandra db
我在 cassandra 数据库中有一列 map<text,text>
我在此 table 中插入数据为:
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>
我怎样才能完成这项工作?
这里的问题(在您的第二个示例中)是 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
字符串,您可以尝试一个简单的 table 像这样:
CREATE TABLE Whosebug.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)
这有点老套,可能需要在您的应用程序端进行一些额外的解析。但它可以解决必须定义每一列的问题。
我在 cassandra 数据库中有一列 map<text,text>
我在此 table 中插入数据为:
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>
我怎样才能完成这项工作?
这里的问题(在您的第二个示例中)是 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
字符串,您可以尝试一个简单的 table 像这样:
CREATE TABLE Whosebug.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)
这有点老套,可能需要在您的应用程序端进行一些额外的解析。但它可以解决必须定义每一列的问题。