首页 > 解决方案 > 如何将 Cassandra 地图存储在数组中?

问题描述

我想以以下结构存储数据:-

"id" : 100, -- primary key
"data" : [
           {
               "imei" : 862304021502870,
               "details" : [ 
                          {
                           "start" : "2018-07-24 12:34:50",
                            "end" : "2018-07-24 12:44:34"
                          },
                          {
                           "start" : "2018-07-24 12:54:50",
                           "end" : "2018-07-24 12:56:34"
                          }
              ]
           }
 ] 

那么如何在 Cassandra 中创建相同的表模式呢?提前致谢。

标签: cassandracassandra-3.0spring-data-cassandra

解决方案


有几种方法可以解决此问题,具体取决于有关数据访问/修改的要求 - 例如,您是否需要修改单个字段,或者您立即更新:

imei将/的映射声明details用户定义类型(UDT),然后像这样声明表:

create table tbl (
   id int primary key,
   data set<frozen<details_udt>>);

但从长远来看,这相对难以支持,尤其是当您添加更多不同类型的嵌套对象时。另外,在嵌套集合/UDT 的情况下,您无法真正更新必须frozen使用的记录字段- 对于此表结构,您需要替换内部的完整记录。set

另一种方法 - 只需对 JSON 或其他格式的数据进行显式序列化/反序列化,并具有如下表结构:

create table tbl(
  id int primary key,
  data text);

字段的类型data取决于您将使用的格式 - 您也可以使用blob它来存储二进制数据。但在这种情况下,您需要更新/获取完整字段。如果您使用Java 驱动程序的自定义编解码器,您可以简化事情,该编解码器将负责您的 Java 数据结构和所需格式之间的转换。请参阅文档中的示例以了解与 JSON 之间的转换。


推荐阅读