是否Cassandra(CQL 3)map
保持空值?我认为允许空值,但我的程序失败则表示不然。或者我使用的驱动程序中是否有错误?
official documentation for CQL map
s says:
地图是一组键入的键值对,其中键是唯一的。此外,请注意,地图在内部按其键排序,因此始终按该顺序返回。
所以键可能不是null(否则排序是不可能的),但是没有提到map values 不是null的要求。
我有一个map<timestamp,uuid>
字段,我正在尝试使用Java Map< Date, UUID >
中的值来编写。其中一个映射值(UUID
s)为空。在编组地图的UUID时,这似乎导致Cassandra客户端代码(Cassandra版本1.2.6,从DataStax Java驱动程序1.0.1调用)中的NPE:
java.lang.NullPointerException
at org.apache.cassandra.utils.UUIDGen.decompose(UUIDGen.java:82)
at org.apache.cassandra.cql.jdbc.JdbcUUID.decompose(JdbcUUID.java:55)
at org.apache.cassandra.db.marshal.UUIDType.decompose(UUIDType.java:187)
at org.apache.cassandra.db.marshal.UUIDType.decompose(UUIDType.java:43)
at org.apache.cassandra.db.marshal.MapType.decompose(MapType.java:122)
at org.apache.cassandra.db.marshal.MapType.decompose(MapType.java:29)
at com.datastax.driver.core.BoundStatement.bind(BoundStatement.java:188)
at [my method]
UUIDGen.decompose(UUID)
方法没有特殊处理null UUID
,因此NPE。与JdbcBoolean.decompose(Boolean)
对比,Boolean
将空JdbcDate.decompose(Date)
分解为空字节缓冲区。同样,Date
将空Map< Date, Integer >
分解为空字节缓冲区。
如果我有一个包含空整数的映射(使用带有空值的Java map<timestamp,int>
,对于Cassandra uuid
),我可以产生类似的问题,所以这个问题不限于{{ 1}}值。
答案 0 :(得分:5)
你是对的,地图中支持的空值不是(但?)。我以前遇到过这个问题,就像你找不到相关的文档一样 - 在类似的情况下我用cqlsh帮助自己
小测试给你答案
CREATE TABLE map_example (
id text,
m map<text, text>,
PRIMARY KEY ((id))
)
试
insert into map_example (id, m ) VALUES ( 'a', {'key':null});
<强>&GT;错误请求:集合中不支持null
HTH,Carlo