Cassandra Collection as Blob

时间:2015-10-02 19:18:31

标签: cassandra cql

有没有办法在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"

1 个答案:

答案 0 :(得分:2)

Apache文档比DataStax文档更具信息性。 Native-type和collection-type是两组不同的类型。 "天然"并不仅仅意味着CQL本身支持的任何类型。

来自Cassandra Apache docs

<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并为我需要支持的每种类型添加了一列。