有没有办法在Cassandra中将集合存储为blob而无需将其转换为文本?似乎不可能。 Cassandra提供blob conversion functions声称支持任何本地非blob类型。
对于CQL支持的每个native,nonblob类型,typeAsBlob函数接受type类型的参数并将其作为blob返回。
如果需要集合类型和成员类型,这种语法可能会变得复杂,这是可以理解的;例如uuidSetAsText
。
专栏系列
> create table blob_test (id text primary key, blob_field blob);
INSERT
文字为blob
> INSERT INTO blob_test (id, blob_field) VALUES ( '5', textAsBlob('test blob text') );
> select * from blob_test ;
id | blob_field
----+--------------------------------
5 | 0x7465737420626c6f622074657874
INSERT
设为blob
> INSERT INTO blob_test (id, blob_field) VALUES ( '6', setAsBlob({'1', '2', '3'}) );
InvalidRequest: code=2200 [Invalid query] message="Unknown function setasblob called"
> INSERT INTO blob_test (id, blob_field) VALUES ( '6', textSetAsBlob({'1', '2', '3'}) );
InvalidRequest: code=2200 [Invalid query] message="Unknown function textsetasblob called"
> INSERT INTO blob_test (id, blob_field) VALUES ( '6', collectionAsBlob({'1', '2', '3'}) );
InvalidRequest: code=2200 [Invalid query] message="Unknown function collectionasblob called"
答案 0 :(得分:2)
Apache文档比DataStax文档更具信息性。 Native-type和collection-type是两组不同的类型。 "天然"并不仅仅意味着CQL本身支持的任何类型。
<type> ::= <native-type>
| <collection-type>
| <tuple-type>
| <string> // Used for custom types. The fully-qualified name of a JAVA class
<native-type> ::= ascii
| bigint
| blob
| boolean
| counter
| decimal
| double
| float
| inet
| int
| text
| timestamp
| timeuuid
| uuid
| varchar
| varint
<collection-type> ::= list '<' <native-type> '>'
| set '<' <native-type> '>'
| map '<' <native-type> ',' <native-type> '>'
<tuple-type> ::= tuple '<' <type> (',' <type>)* '>'
解决方法是将集合转换为文本,然后使用blob函数。
> INSERT INTO blob_test (id, blob_field) VALUES ( '6', textAsBlob('{"1", "2", "3"}') );
在我的情况下,我只是避免了blob并为我需要支持的每种类型添加了一列。