【问题标题】:May Cassandra maps hold null values可能 Cassandra 地图持有空值
【发布时间】: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


【解决方案1】:

你是对的,空值在地图中不(还?)支持。我以前遇到过这件事,就像你找不到相关文档一样——在类似的情况下,我用 cqlsh 帮助自己

一个小测试给你答案

CREATE TABLE map_example (
  id text,
  m map<text, text>,
  PRIMARY KEY ((id))
)

试试

insert into map_example (id, m ) VALUES ( 'a', {'key':null});

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

HTH,卡罗

【讨论】:

    猜你喜欢
    • 2013-07-06
    • 2020-04-27
    • 1970-01-01
    • 2014-05-17
    • 1970-01-01
    • 2020-12-25
    • 2016-06-29
    • 2019-01-03
    • 2023-03-17
    相关资源
    最近更新 更多