May Cassandra地图保存空值

时间:2014-07-29 13:48:36

标签: dictionary null cassandra

是否Cassandra(CQL 3)map保持空值?我认为允许空值,但我的程序失败则表示不然。或者我使用的驱动程序中是否有错误?

official documentation for CQL maps 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}}值。

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