这里的问题(在您的第二个示例中)是 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>);
在您的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)
这有点麻烦,可能需要在您的应用程序端进行一些额外的解析。但它可以解决必须定义每一列的问题。