May Cassandra地图保存空值

Rae*_*ald 8 null dictionary cassandra

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

对CQL官方文档map小号说:

映射是一组键入的键值对,其中键是唯一的.此外,请注意,地图在内部按其键排序,因此始终按该顺序返回.

所以可能不是null(否则排序是不可能的),但是没有提到要求map 不为null.

我有一个字段,map<timestamp,uuid>我试图用Java中的值写入Map< Date, UUID >.其中一个映射值为UUIDnull.在编组映射的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]
Run Code Online (Sandbox Code Playgroud)

UUIDGen.decompose(UUID)方法没有特殊处理null UUID,因此NPE.与之对比JdbcBoolean.decompose(Boolean),将null分解为Boolean空字节缓冲区.类似地,JdbcDate.decompose(Date)将null分解为Date空字节缓冲区.


如果我有一个包含空整数的映射(使用Map< Date, Integer >带有空值的Java ,对于Cassandra map<timestamp,int>),我可以产生类似的问题,所以这个问题不仅限于uuid值.

Car*_*ini 5

你是对的,地图中支持空值(但是?).我之前遇到过这个问题,就像你找不到相关的文档一样 - 在类似的情况下我用cqlsh帮助自己

一个小测试给你答案

CREATE TABLE map_example (
  id text,
  m map<text, text>,
  PRIMARY KEY ((id))
)
Run Code Online (Sandbox Code Playgroud)

尝试

insert into map_example (id, m ) VALUES ( 'a', {'key':null});
Run Code Online (Sandbox Code Playgroud)

>错误请求:集合内不支持null

HTH,卡罗