【发布时间】:2014-09-20 22:10:47
【问题描述】:
Cassandra (CQL 3) map 可以保存空值吗?我认为空值是允许的,但我的程序失败表明并非如此。还是我正在使用的驱动程序有错误?
official documentation for CQL maps says:
映射是一组类型化的键值对,其中键是唯一的。此外,请注意地图在内部按其键排序,因此将始终按该顺序返回。
所以 keys 可能不为 null(否则无法排序),但没有提到 map values 不为 null 的要求。
我有一个字段是 map<timestamp,uuid>,我正在尝试使用 Java Map< Date, UUID > 中的值写入该字段。地图值之一 (UUIDs) 为空。在编组地图的 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) 将 null Date 分解为空字节缓冲区。
如果我有一个包含空整数的映射(使用带有空值的 Java Map< Date, Integer >,对于 Cassandra map<timestamp,int>),我会产生类似的问题,所以这个问题不限于 uuid 值。
【问题讨论】:
-
好吧,如果他们要允许空值,似乎数据类型需要一致地处理它们。所以我会说这是一个错误。
标签: dictionary null cassandra